<html><body>
<style>

body, h1, h2, h3, div, span, p, pre, a {
  margin: 0;
  padding: 0;
  border: 0;
  font-weight: inherit;
  font-style: inherit;
  font-size: 100%;
  font-family: inherit;
  vertical-align: baseline;
}

body {
  font-size: 13px;
  padding: 1em;
}

h1 {
  font-size: 26px;
  margin-bottom: 1em;
}

h2 {
  font-size: 24px;
  margin-bottom: 1em;
}

h3 {
  font-size: 20px;
  margin-bottom: 1em;
  margin-top: 1em;
}

pre, code {
  line-height: 1.5;
  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
}

pre {
  margin-top: 0.5em;
}

h1, h2, h3, p {
  font-family: Arial, sans serif;
}

h1, h2, h3 {
  border-bottom: solid #CCC 1px;
}

.toc_element {
  margin-top: 0.5em;
}

.firstline {
  margin-left: 2 em;
}

.method  {
  margin-top: 1em;
  border: solid 1px #CCC;
  padding: 1em;
  background: #EEE;
}

.details {
  font-weight: bold;
  font-size: 14px;
}

</style>

<h1><a href="sheets_v4.html">Google Sheets API</a> . <a href="sheets_v4.spreadsheets.html">spreadsheets</a></h1>
<h2>Instance Methods</h2>
<p class="toc_element">
  <code><a href="sheets_v4.spreadsheets.developerMetadata.html">developerMetadata()</a></code>
</p>
<p class="firstline">Returns the developerMetadata Resource.</p>

<p class="toc_element">
  <code><a href="sheets_v4.spreadsheets.sheets.html">sheets()</a></code>
</p>
<p class="firstline">Returns the sheets Resource.</p>

<p class="toc_element">
  <code><a href="sheets_v4.spreadsheets.values.html">values()</a></code>
</p>
<p class="firstline">Returns the values Resource.</p>

<p class="toc_element">
  <code><a href="#batchUpdate">batchUpdate(spreadsheetId, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Applies one or more updates to the spreadsheet.</p>
<p class="toc_element">
  <code><a href="#create">create(body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Creates a spreadsheet, returning the newly created spreadsheet.</p>
<p class="toc_element">
  <code><a href="#get">get(spreadsheetId, includeGridData=None, ranges=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the spreadsheet at the given ID.</p>
<p class="toc_element">
  <code><a href="#getByDataFilter">getByDataFilter(spreadsheetId, body=None, x__xgafv=None)</a></code></p>
<p class="firstline">Returns the spreadsheet at the given ID.</p>
<h3>Method Details</h3>
<div class="method">
    <code class="details" id="batchUpdate">batchUpdate(spreadsheetId, body=None, x__xgafv=None)</code>
  <pre>Applies one or more updates to the spreadsheet.

Each request is validated before
being applied. If any request is not valid then the entire request will
fail and nothing will be applied.

Some requests have replies to
give you some information about how
they are applied. The replies will mirror the requests.  For example,
if you applied 4 updates and the 3rd one had a reply, then the
response will have 2 empty replies, the actual reply, and another empty
reply, in that order.

Due to the collaborative nature of spreadsheets, it is not guaranteed that
the spreadsheet will reflect exactly your changes after this completes,
however it is guaranteed that the updates in the request will be
applied together atomically. Your changes may be altered with respect to
collaborator changes. If there are no collaborators, the spreadsheet
should reflect your changes.

Args:
  spreadsheetId: string, The spreadsheet to apply the updates to. (required)
  body: object, The request body.
    The object takes the form of:

{ # The request for updating any aspect of a spreadsheet.
    &quot;requests&quot;: [ # A list of updates to apply to the spreadsheet.
        # Requests will be applied in the order they are specified.
        # If any request is not valid, no requests will be applied.
      { # A single kind of update to apply to a spreadsheet.
        &quot;appendCells&quot;: { # Adds new cells after the last row with data in a sheet, # Appends cells after the last row with data in a sheet.
            # inserting new rows into the sheet if necessary.
          &quot;fields&quot;: &quot;A String&quot;, # The fields of CellData that should be updated.
              # At least one field must be specified.
              # The root is the CellData; &#x27;row.values.&#x27; should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;rows&quot;: [ # The data to append.
            { # Data about each cell in a row.
              &quot;values&quot;: [ # The values in the row, one per column.
                { # Data about a specific cell.
                  &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                      # is computed dynamically based on its data, grouping, filters, values,
                      # etc. Only the top-left cell of the pivot table contains the pivot table
                      # definition. The other cells will contain the calculated values of the
                      # results of the pivot in their effective_value fields.
                    &quot;rows&quot;: [ # Each row grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                        &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                        &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group&#x27;s values.
                          &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                          &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group &amp; two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                              # this would correspond to using the &quot;Total&quot; of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                        },
                        &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                            # This is only valid for row groupings and is ignored by columns.
                            #
                            # By default, we minimize repitition of headings by not showing higher
                            # level headings where they are the same. For example, even though the
                            # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                            # it is redundant with previous rows. Setting repeat_headings to true
                            # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                            #
                            #     +--------------+
                            #     | Q1     | Jan |
                            #     |        | Feb |
                            #     |        | Mar |
                            #     +--------+-----+
                            #     | Q1 Total     |
                            #     +--------------+
                        &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                            &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          },
                        ],
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                            # in the source data column rather than breaking out each individual value.
                            # Only one PivotGroup with a group rule may be added for each column in
                            # the source data, though on any given column you may add both a
                            # PivotGroup that has a rule and a PivotGroup that does not.
                          &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                              # buckets of a constant size. All values from HistogramRule.start to
                              # HistogramRule.end are placed into groups of size
                              # HistogramRule.interval. In addition, all values below
                              # HistogramRule.start are placed in one group, and all values above
                              # HistogramRule.end are placed in another. Only
                              # HistogramRule.interval is required, though if HistogramRule.start
                              # and HistogramRule.end are both provided, HistogramRule.start must
                              # be less than HistogramRule.end. For example, a pivot table showing
                              # average purchase amount by age that has 50+ rows:
                              #
                              #     +-----+-------------------+
                              #     | Age | AVERAGE of Amount |
                              #     +-----+-------------------+
                              #     | 16  |            $27.13 |
                              #     | 17  |             $5.24 |
                              #     | 18  |            $20.15 |
                              #     ...
                              #     +-----+-------------------+
                              # could be turned into a pivot table that looks like the one below by
                              # applying a histogram group rule with a HistogramRule.start of 25,
                              # an HistogramRule.interval of 20, and an HistogramRule.end
                              # of 65.
                              #
                              #     +-------------+-------------------+
                              #     | Grouped Age | AVERAGE of Amount |
                              #     +-------------+-------------------+
                              #     | &lt; 25        |            $19.34 |
                              #     | 25-45       |            $31.43 |
                              #     | 45-65       |            $35.87 |
                              #     | &gt; 65        |            $27.55 |
                              #     +-------------+-------------------+
                              #     | Grand Total |            $29.12 |
                              #     +-------------+-------------------+
                            &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                # of constant size. Values below start are lumped into a single bucket.
                                # This field is optional.
                            &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                # of constant size. Values above end are lumped into a single bucket.
                                # This field is optional.
                            &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                          },
                          &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                              # buckets based on selected parts of their date or time values. For example,
                              # consider a pivot table showing sales transactions by date:
                              #
                              #     +----------+--------------+
                              #     | Date     | SUM of Sales |
                              #     +----------+--------------+
                              #     | 1/1/2017 |      $621.14 |
                              #     | 2/3/2017 |      $708.84 |
                              #     | 5/8/2017 |      $326.84 |
                              #     ...
                              #     +----------+--------------+
                              # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                              # results in the following pivot table.
                              #
                              #     +--------------+--------------+
                              #     | Grouped Date | SUM of Sales |
                              #     +--------------+--------------+
                              #     | 2017-Jan     |   $53,731.78 |
                              #     | 2017-Feb     |   $83,475.32 |
                              #     | 2017-Mar     |   $94,385.05 |
                              #     ...
                              #     +--------------+--------------+
                            &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                          },
                          &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                              # buckets with names of your choosing. For example, a pivot table that
                              # aggregates population by state:
                              #
                              #     +-------+-------------------+
                              #     | State | SUM of Population |
                              #     +-------+-------------------+
                              #     | AK    |               0.7 |
                              #     | AL    |               4.8 |
                              #     | AR    |               2.9 |
                              #     ...
                              #     +-------+-------------------+
                              # could be turned into a pivot table that aggregates population by time zone
                              # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                              # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                              # Note that a similar effect could be achieved by adding a time zone column
                              # to the source data and adjusting the pivot table.
                              #
                              #     +-----------+-------------------+
                              #     | Time Zone | SUM of Population |
                              #     +-----------+-------------------+
                              #     | Central   |             106.3 |
                              #     | Eastern   |             151.9 |
                              #     | Mountain  |              17.4 |
                              #     ...
                              #     +-----------+-------------------+
                            &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                # that map to each group name.
                              { # A group name and a list of items from the source data that should be placed
                                  # in the group with this name.
                                &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                    # item may be a string, number, or boolean. Items may appear in at most one
                                    # group within a given ManualRule. Items that do not appear in any
                                    # group will appear on their own.
                                  { # The kinds of value that a cell in a spreadsheet can have.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                ],
                                &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                    # ManualRule must have a unique group name.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                          },
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                            # example, in the following pivot table, the row label is `Region` (which
                            # could be renamed to `State`) and the column label is `Product` (which
                            # could be renamed `Item`). Pivot tables created before December 2017 do
                            # not have header labels. If you&#x27;d like to add header labels to an existing
                            # pivot table, please delete the existing pivot table and then create a new
                            # pivot table with same parameters.
                            #
                            #     +--------------+---------+-------+
                            #     | SUM of Units | Product |       |
                            #     | Region       | Pen     | Paper |
                            #     +--------------+---------+-------+
                            #     | New York     |     345 |    98 |
                            #     | Oregon       |     234 |   123 |
                            #     | Tennessee    |     531 |   415 |
                            #     +--------------+---------+-------+
                            #     | Grand Total  |    1110 |   636 |
                            #     +--------------+---------+-------+
                      },
                    ],
                    &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                    &quot;values&quot;: [ # A list of values to include in the pivot table.
                      { # The definition of how a value in a pivot table should be calculated.
                        &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                            # the result of a calculation with another pivot value. For example, if
                            # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                            # pivot values are displayed as the percentage of the grand total. In
                            # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                            # pivot table.
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this value refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                            # with an `=` character.
                        &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                            # If formula is set, the only supported values are
                            # SUM and
                            # CUSTOM.
                            # If sourceColumnOffset is set, then `CUSTOM`
                            # is not supported.
                        &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                      },
                    ],
                    &quot;columns&quot;: [ # Each column grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                        &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                        &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group&#x27;s values.
                          &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                          &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group &amp; two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                              # this would correspond to using the &quot;Total&quot; of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                        },
                        &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                            # This is only valid for row groupings and is ignored by columns.
                            #
                            # By default, we minimize repitition of headings by not showing higher
                            # level headings where they are the same. For example, even though the
                            # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                            # it is redundant with previous rows. Setting repeat_headings to true
                            # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                            #
                            #     +--------------+
                            #     | Q1     | Jan |
                            #     |        | Feb |
                            #     |        | Mar |
                            #     +--------+-----+
                            #     | Q1 Total     |
                            #     +--------------+
                        &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                            &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          },
                        ],
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                            # in the source data column rather than breaking out each individual value.
                            # Only one PivotGroup with a group rule may be added for each column in
                            # the source data, though on any given column you may add both a
                            # PivotGroup that has a rule and a PivotGroup that does not.
                          &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                              # buckets of a constant size. All values from HistogramRule.start to
                              # HistogramRule.end are placed into groups of size
                              # HistogramRule.interval. In addition, all values below
                              # HistogramRule.start are placed in one group, and all values above
                              # HistogramRule.end are placed in another. Only
                              # HistogramRule.interval is required, though if HistogramRule.start
                              # and HistogramRule.end are both provided, HistogramRule.start must
                              # be less than HistogramRule.end. For example, a pivot table showing
                              # average purchase amount by age that has 50+ rows:
                              #
                              #     +-----+-------------------+
                              #     | Age | AVERAGE of Amount |
                              #     +-----+-------------------+
                              #     | 16  |            $27.13 |
                              #     | 17  |             $5.24 |
                              #     | 18  |            $20.15 |
                              #     ...
                              #     +-----+-------------------+
                              # could be turned into a pivot table that looks like the one below by
                              # applying a histogram group rule with a HistogramRule.start of 25,
                              # an HistogramRule.interval of 20, and an HistogramRule.end
                              # of 65.
                              #
                              #     +-------------+-------------------+
                              #     | Grouped Age | AVERAGE of Amount |
                              #     +-------------+-------------------+
                              #     | &lt; 25        |            $19.34 |
                              #     | 25-45       |            $31.43 |
                              #     | 45-65       |            $35.87 |
                              #     | &gt; 65        |            $27.55 |
                              #     +-------------+-------------------+
                              #     | Grand Total |            $29.12 |
                              #     +-------------+-------------------+
                            &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                # of constant size. Values below start are lumped into a single bucket.
                                # This field is optional.
                            &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                # of constant size. Values above end are lumped into a single bucket.
                                # This field is optional.
                            &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                          },
                          &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                              # buckets based on selected parts of their date or time values. For example,
                              # consider a pivot table showing sales transactions by date:
                              #
                              #     +----------+--------------+
                              #     | Date     | SUM of Sales |
                              #     +----------+--------------+
                              #     | 1/1/2017 |      $621.14 |
                              #     | 2/3/2017 |      $708.84 |
                              #     | 5/8/2017 |      $326.84 |
                              #     ...
                              #     +----------+--------------+
                              # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                              # results in the following pivot table.
                              #
                              #     +--------------+--------------+
                              #     | Grouped Date | SUM of Sales |
                              #     +--------------+--------------+
                              #     | 2017-Jan     |   $53,731.78 |
                              #     | 2017-Feb     |   $83,475.32 |
                              #     | 2017-Mar     |   $94,385.05 |
                              #     ...
                              #     +--------------+--------------+
                            &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                          },
                          &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                              # buckets with names of your choosing. For example, a pivot table that
                              # aggregates population by state:
                              #
                              #     +-------+-------------------+
                              #     | State | SUM of Population |
                              #     +-------+-------------------+
                              #     | AK    |               0.7 |
                              #     | AL    |               4.8 |
                              #     | AR    |               2.9 |
                              #     ...
                              #     +-------+-------------------+
                              # could be turned into a pivot table that aggregates population by time zone
                              # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                              # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                              # Note that a similar effect could be achieved by adding a time zone column
                              # to the source data and adjusting the pivot table.
                              #
                              #     +-----------+-------------------+
                              #     | Time Zone | SUM of Population |
                              #     +-----------+-------------------+
                              #     | Central   |             106.3 |
                              #     | Eastern   |             151.9 |
                              #     | Mountain  |              17.4 |
                              #     ...
                              #     +-----------+-------------------+
                            &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                # that map to each group name.
                              { # A group name and a list of items from the source data that should be placed
                                  # in the group with this name.
                                &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                    # item may be a string, number, or boolean. Items may appear in at most one
                                    # group within a given ManualRule. Items that do not appear in any
                                    # group will appear on their own.
                                  { # The kinds of value that a cell in a spreadsheet can have.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                ],
                                &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                    # ManualRule must have a unique group name.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                          },
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                            # example, in the following pivot table, the row label is `Region` (which
                            # could be renamed to `State`) and the column label is `Product` (which
                            # could be renamed `Item`). Pivot tables created before December 2017 do
                            # not have header labels. If you&#x27;d like to add header labels to an existing
                            # pivot table, please delete the existing pivot table and then create a new
                            # pivot table with same parameters.
                            #
                            #     +--------------+---------+-------+
                            #     | SUM of Units | Product |       |
                            #     | Region       | Pen     | Paper |
                            #     +--------------+---------+-------+
                            #     | New York     |     345 |    98 |
                            #     | Oregon       |     234 |   123 |
                            #     | Tennessee    |     531 |   415 |
                            #     +--------------+---------+-------+
                            #     | Grand Total  |    1110 |   636 |
                            #     +--------------+---------+-------+
                      },
                    ],
                    &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                        # or vertically (as rows).
                    &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                        #
                        # The filters are applied before aggregating data into the pivot table.
                        # The map&#x27;s key is the column offset of the source range that you want to
                        # filter, and the value is the criteria for that column.
                        #
                        # For example, if the source was `C10:E15`, a key of `0` will have the filter
                        # for column `C`, whereas the key `1` is for column `D`.
                      &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                        &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                          &quot;A String&quot;,
                        ],
                      },
                    },
                  },
                  &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                      # This is the value as it&#x27;s shown to the user.
                      # This field is read-only.
                  &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                      # on user entered strings, not formulas, bools, or numbers.
                      # Runs start at specific indexes in the text and continue until the next
                      # run. Properties of a run will continue unless explicitly changed
                      # in a subsequent run (and properties of the first run will continue
                      # the properties of the cell unless explicitly changed).
                      #
                      # When writing, the new runs will overwrite any prior runs.  When writing a
                      # new user_entered_value, previous runs are erased.
                    { # A run of a text format. The format of this run continues until the start
                        # index of the next run.
                        # When updating, all fields must be set.
                      &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;startIndex&quot;: 42, # The character index where this run starts.
                    },
                  ],
                  &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                      # the calculated value.  For cells with literals, this is
                      # the same as the user_entered_value.
                      # This field is read-only.
                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                          # (in the spreadsheet&#x27;s locale).
                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                    },
                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                        # `&quot;123&quot;`.
                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # &quot;serial number&quot; format.
                  },
                  &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                      # This includes the results of applying any conditional formatting and,
                      # if the cell contains a formula, the computed number format.
                      # If the effective format is the default format, effective format will
                      # not be written.
                      # This field is read-only.
                    &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                    &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                    &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                    &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                      &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user&#x27;s locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                          # more information about the supported patterns.
                      &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                          # When writing, this field must be set.
                    },
                    &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                      &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                    },
                    &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                      &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                          # Measured in degrees. Valid values are between -90 and 90. Positive
                          # angles are angled upwards, negative are angled downwards.
                          #
                          # Note: For LTR text direction positive angles are in the
                          # counterclockwise direction, whereas for RTL they are in the clockwise
                          # direction
                      &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                          # characters is unchanged.
                          # For example:
                          #
                          #     | V |
                          #     | e |
                          #     | r |
                          #     | t |
                          #     | i |
                          #     | c |
                          #     | a |
                          #     | l |
                    },
                    &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                        # If background_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      &quot;right&quot;: 42, # The right padding of the cell.
                      &quot;bottom&quot;: 42, # The bottom padding of the cell.
                      &quot;left&quot;: 42, # The left padding of the cell.
                      &quot;top&quot;: 42, # The top padding of the cell.
                    },
                    &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                  &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                      #
                      # When writing, the new format will be merged with the existing format.
                    &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                    &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                    &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                    &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                      &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user&#x27;s locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                          # more information about the supported patterns.
                      &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                          # When writing, this field must be set.
                    },
                    &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                      &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                    },
                    &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                      &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                          # Measured in degrees. Valid values are between -90 and 90. Positive
                          # angles are angled upwards, negative are angled downwards.
                          #
                          # Note: For LTR text direction positive angles are in the
                          # counterclockwise direction, whereas for RTL they are in the clockwise
                          # direction
                      &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                          # characters is unchanged.
                          # For example:
                          #
                          #     | V |
                          #     | e |
                          #     | r |
                          #     | t |
                          #     | i |
                          #     | c |
                          #     | a |
                          #     | l |
                    },
                    &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                        # If background_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      &quot;right&quot;: 42, # The right padding of the cell.
                      &quot;bottom&quot;: 42, # The bottom padding of the cell.
                      &quot;left&quot;: 42, # The left padding of the cell.
                      &quot;top&quot;: 42, # The top padding of the cell.
                    },
                    &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                      # Note: Dates, Times and DateTimes are represented as doubles in
                      # serial number format.
                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                          # (in the spreadsheet&#x27;s locale).
                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                    },
                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                        # `&quot;123&quot;`.
                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # &quot;serial number&quot; format.
                  },
                  &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                      #
                      # When writing, the new data validation rule will overwrite any prior rule.
                    &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                        # If true, &quot;List&quot; conditions will show a dropdown.
                    &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                    &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                    &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                        # BooleanConditions are used by conditional formatting,
                        # data validation, and the criteria in filters.
                      &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                          # on the condition type.  Some support zero values,
                          # others one or two values,
                          # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                        { # The value of the condition.
                          &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                              # Valid only if the type is
                              # DATE_BEFORE,
                              # DATE_AFTER,
                              # DATE_ON_OR_BEFORE or
                              # DATE_ON_OR_AFTER.
                              #
                              # Relative dates are not supported in data validation.
                              # They are supported only in conditional formatting and
                              # conditional filters.
                          &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                              # The value is parsed as if the user typed into a cell.
                              # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                        },
                      ],
                      &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                    },
                  },
                  &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                      # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                      # in the userEnteredValue.formulaValue
                      # field.)
                },
              ],
            },
          ],
          &quot;sheetId&quot;: 42, # The sheet ID to append the data to.
        },
        &quot;deleteBanding&quot;: { # Removes the banded range with the given ID from the spreadsheet. # Removes a banded range
          &quot;bandedRangeId&quot;: 42, # The ID of the banded range to delete.
        },
        &quot;updateChartSpec&quot;: { # Updates a chart&#x27;s specifications. # Updates a chart&#x27;s specifications.
            # (This does not move or resize a chart. To move or resize a chart, use
            #  UpdateEmbeddedObjectPositionRequest.)
          &quot;spec&quot;: { # The specifications of a chart. # The specification to apply to the chart.
            &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                # chart&lt;/a&gt;.
              &quot;data&quot;: [ # The Candlestick chart data.
                  # Only one CandlestickData is supported.
                { # The Candlestick chart data, each containing the low, open, close, and high
                    # values for a series.
                  &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                      # candle. This is the bottom of the candle body.  If less than the close
                      # value the candle will be filled.  Otherwise the candle will be hollow.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                      # candle. This is the top of the candle&#x27;s center line.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                      # This is the top of the candle body.  If greater than the open value the
                      # candle will be filled.  Otherwise the candle will be hollow.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                      # This is the bottom of the candle&#x27;s center line.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                },
              ],
              &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                  # will be treated as discrete labels, other data will be treated as
                  # continuous values.
                &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
            },
            &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                # A histogram chart groups data items into bins, displaying each bin as a
                # column of stacked items.  Histograms are used to display the distribution
                # of a dataset.  Each column of items represents a range into which those
                # items fall.  The number of bins can be chosen automatically or specified
                # explicitly.
              &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                  # column.
              &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                  # bucketed or multiple series, each of the same length, containing the name
                  # of the series followed by the values to be bucketed for that series.
                { # A histogram series containing the series color and data.
                  &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                      # This field is optional.
                      # If bar_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                      # This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              ],
              &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
              &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                  # column) is chosen automatically, but it may be overridden here.
                  # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                  # Cannot be negative.
                  # This field is optional.
              &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                  # affect the calculation of bucket sizes.  For example, setting an outlier
                  # percentile of 0.05 indicates that the top and bottom 5% of values when
                  # calculating buckets.  The values are still included in the chart, they will
                  # be added to the first or last buckets instead of their own buckets.
                  # Must be between 0.0 and 0.5.
            },
            &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                # Not applicable to Org charts.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
              &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                  # on the treemap chart. These levels are not interactive and are shown
                  # without their labels. Defaults to 0 if not specified.
              &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                  # interactive and are shown with their labels. Defaults to 2 if not
                  # specified.
              &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                  # assigned colors based on their color values. These color values come from
                  # color_data, or from size_data if color_data is not specified.
                  # Cells with color values less than or equal to min_value will
                  # have minValueColor as their
                  # background color. Cells with color values greater than or equal to
                  # max_value will have
                  # maxValueColor as their background
                  # color. Cells with color values between min_value and max_value will
                  # have background colors on a gradient between
                  # minValueColor and
                  # maxValueColor, the midpoint of
                  # the gradient being midValueColor.
                  # Cells with missing or non-numeric color values will have
                  # noDataColor as their background
                  # color.
                &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                    # them. Defaults to #000000 if not specified.
                    # If no_data_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                    # minValue. Defaults to #dc3912 if not
                    # specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                    # minValue. Defaults to #dc3912 if not
                    # specified.
                    # If min_value_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                    # minValue and
                    # maxValue. Defaults to #efe6dc if not
                    # specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                    # them. Defaults to #000000 if not specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                    # to maxValue. Defaults to #109618 if not
                    # specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                    # minValue and
                    # maxValue. Defaults to #efe6dc if not
                    # specified.
                    # If mid_value_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                    # to maxValue. Defaults to #109618 if not
                    # specified.
                    # If max_value_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                  # If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                  # have the same color as cells with this value. If not specified, defaults
                  # to the actual minimum value from color_data, or the minimum value from
                  # size_data if color_data is not specified.
              &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                  # have the same color as cells with this value. If not specified, defaults
                  # to the actual maximum value from color_data, or the maximum value from
                  # size_data if color_data is not specified.
              &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                  # This field is optional. If not specified, size_data is used to
                  # determine background colors. If specified, the data is expected to be
                  # numeric. color_scale will determine how the values in this data map to
                  # data cell background colors.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                  # expected to be numeric. The cells corresponding to non-numeric or missing
                  # data will not be rendered. If color_data is not specified, this data
                  # is used to determine data cell background colors as well.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
            },
            &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                # See BasicChartType for the list of all
                # charts this supports.
                # of charts this supports.
              &quot;series&quot;: [ # The data this chart is visualizing.
                { # A single series of data in a chart.
                    # For example, if charting stock prices over time, multiple series may exist,
                    # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                  &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                      # chartType is AREA,
                      # LINE, or SCATTER.
                      # COMBO charts are also supported if the
                      # series chart type is
                      # AREA or LINE.
                    &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                    &quot;width&quot;: 42, # The thickness of the line, in px.
                  },
                  &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                      # this series.  If empty, a default color is used.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                      # For example, if charting stocks over time, the &quot;Volume&quot; series
                      # may want to be pinned to the right with the prices pinned to the left,
                      # because the scale of trading volume is different than the scale of
                      # prices.
                      # It is an error to specify an axis that isn&#x27;t a valid minor axis
                      # for the chart&#x27;s type.
                  &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                      # chartType is
                      # COMBO.
                      # Different types will change the way the series is visualized.
                      # Only LINE, AREA,
                      # and COLUMN are supported.
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                      # this series.  If empty, a default color is used.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              ],
              &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
              &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                  # Applies to Bar and Column charts.
              &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                  # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
              &quot;domains&quot;: [ # The domain of data this is charting.
                  # Only a single domain is supported.
                { # The domain of a chart.
                    # For example, if charting stock prices over time, this would be the date.
                  &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                      # this is the data representing the dates.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                },
              ],
              &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                  # Applies to Line charts.
              &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                  # If not set, Google Sheets will guess how many rows are headers based
                  # on the data.
                  #
                  # (Note that BasicChartAxis.title may override the axis title
                  #  inferred from the header values.)
              &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                  # chart area.
              &quot;axis&quot;: [ # The axis on the chart.
                { # An axis of the chart.
                    # A chart may not have more than one axis per
                    # axis position.
                  &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                      # from headers of the data.
                  &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                  &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                      # Only valid if the axis is not associated with the domain.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                      # values in an axis).
                    &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                        # automatically determine a minimum value that looks good for the data.
                    &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                    &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                        # automatically determine a maximum value that looks good for the data.
                  },
                },
              ],
              &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
              &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                  # segments of lines in a line chart will be missing).  To eliminate these
                  # gaps set this to true.
                  # Applies to Line, Area, and Combo charts.
            },
            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
            &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
              &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
              &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
              &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                &quot;width&quot;: 42, # The thickness of the line, in px.
              },
              &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                { # A single series of data for a waterfall chart.
                  &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                      # subtotals are defined is not significant. Only one subtotal may be
                      # defined for each data point.
                    { # A custom subtotal column for a waterfall chart series.
                      &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                          # data_is_subtotal is true, the data point at this index is the
                          # subtotal. Otherwise, the subtotal appears after the data point with
                          # this index. A series can have multiple subtotals at arbitrary indices,
                          # but subtotals do not affect the indices of the data points. For
                          # example, if a series has three data points, their indices will always
                          # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                          # what data points they are associated with.
                      &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                          # the subtotal will be computed and appear after the data point.
                      &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                    },
                  ],
                  &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                      # a subtotal column will appear at the end of each series. Setting this
                      # field to true will hide that subtotal column for this series.
                  &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                    &quot;colorStyle&quot;: { # A color value. # The color of the column.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                  },
                  &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                    &quot;colorStyle&quot;: { # A color value. # The color of the column.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                  },
                  &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                    &quot;colorStyle&quot;: { # A color value. # The color of the column.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                  },
                },
              ],
              &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
            },
            &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                # Strikethrough and underline are not supported.
                # Absent values indicate that the field isn&#x27;t specified.
              &quot;fontSize&quot;: 42, # The size of the font.
              &quot;underline&quot;: True or False, # True if the text is underlined.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                  # If foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;bold&quot;: True or False, # True if the text is bold.
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;italic&quot;: True or False, # True if the text is italicized.
              &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
            },
            &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                # Org charts require a unique set of labels in labels and may
                # optionally include parent_labels and tooltips.
                # parent_labels contain, for each node, the label identifying the parent
                # node.  tooltips contain, for each node, an optional tooltip.
                #
                # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
              &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                  # A blank value indicates that the node has no parent and is a top-level
                  # node.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                  # If selected_node_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                  # If node_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                  # results in no tooltip being displayed for the node.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
              &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                  # must be unique.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
            },
            &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
              &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
              &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
              &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
              &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
            },
            &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                # for accessibility.
            &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                # This field is optional.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
            },
            &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                # axis labels, legend).  If a font is specified for a specific part of the
                # chart it will override this font name.
            &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                # Strikethrough and underline are not supported.
                # Absent values indicate that the field isn&#x27;t specified.
              &quot;fontSize&quot;: 42, # The size of the font.
              &quot;underline&quot;: True or False, # True if the text is underlined.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                  # If foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;bold&quot;: True or False, # True if the text is bold.
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;italic&quot;: True or False, # True if the text is italicized.
              &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
            },
            &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                # minimum padding.  False to use the default padding.
                # (Not applicable to Geo and Org charts.)
            &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                # This field is optional.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
            },
            &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                # represent things like total sales, average cost, or a top selling item. You
                # can specify a single data value, or aggregate over a range of data.
                # Percentage or absolute difference from a baseline value can be highlighted,
                # like changes over time.
              &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                  # This field is optional.
              &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                  # This field is optional.
              &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                  # 10 can be used to divide all values in the chart by 10.
                  # This field is optional.
              &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                  # This field is needed only if baseline_value_data is specified.
                &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                    # This field is optional.
                &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                    # key value. This field is optional.
                    # If positive_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                    # key value. This field is optional.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                    # key value. This field is optional.
                    # If negative_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                    # This field is optional. If not specified, default positioning is used.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                },
                &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                    # key value. This field is optional.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                    # This field is optional. If not specified, default positioning is used.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                },
              },
              &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                  # chart. This field is used only when number_format_source is set to
                  # CUSTOM. This field is optional.
                &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                    # This field is optional.
                &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                    # This field is optional.
              },
            },
            &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                # Not applicable to Org charts.
                # If background_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
            &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
            &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
              &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                  # 0 is fully transparent and 1 is fully opaque.
              &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                  # the bubbles at different sizes relative to each other.
                  # If specified, group_ids must also be specified.  This field is
                  # optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                  # If specific, the field must be a positive value.
              &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                  # If specified, the field must be a positive value.
              &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                  # If bubble_border_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                  # ID are drawn in the same color. If bubble_sizes is specified then
                  # this field must also be specified but may contain blank values.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                  # in the chart vertically.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
              &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                  # in the chart horizontally.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                  # Underline and Strikethrough are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
            },
          },
          &quot;chartId&quot;: 42, # The ID of the chart to update.
        },
        &quot;deleteNamedRange&quot;: { # Removes the named range with the given ID from the spreadsheet. # Deletes a named range.
          &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range to delete.
        },
        &quot;trimWhitespace&quot;: { # Trims the whitespace (such as spaces, tabs, or new lines) in every cell in # Trims cells of whitespace (such as spaces, tabs, or new lines).
            # the specified range. This request removes all whitespace from the start and
            # end of each cell&#x27;s text, and reduces any subsequence of remaining whitespace
            # characters to a single space. If the resulting trimmed text starts with a &#x27;+&#x27;
            # or &#x27;=&#x27; character, the text remains as a string value and isn&#x27;t interpreted
            # as a formula.
          &quot;range&quot;: { # A range on a sheet. # The range whose cells to trim.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;insertDimension&quot;: { # Inserts rows or columns in a sheet at a particular index. # Inserts new rows or columns in a sheet.
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The dimensions to insert.  Both the start and end indexes must be bounded.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
          &quot;inheritFromBefore&quot;: True or False, # Whether dimension properties should be extended from the dimensions
              # before or after the newly inserted dimensions.
              # True to inherit from the dimensions before (in which case the start
              # index must be greater than 0), and false to inherit from the dimensions
              # after.
              #
              # For example, if row index 0 has red background and row index 1
              # has a green background, then inserting 2 rows at index 1 can inherit
              # either the green or red background.  If `inheritFromBefore` is true,
              # the two new rows will be red (because the row before the insertion point
              # was red), whereas if `inheritFromBefore` is false, the two new rows will
              # be green (because the row after the insertion point was green).
        },
        &quot;deleteSheet&quot;: { # Deletes the requested sheet. # Deletes a sheet.
          &quot;sheetId&quot;: 42, # The ID of the sheet to delete.
        },
        &quot;repeatCell&quot;: { # Updates all cells in the range to the values in the given Cell object. # Repeats a single cell across a range.
            # Only the fields listed in the fields field are updated; others are
            # unchanged.
            #
            # If writing a cell with a formula, the formula&#x27;s ranges will automatically
            # increment for each field in the range.
            # For example, if writing a cell with formula `=A1` into range B2:C4,
            # B2 would be `=A1`, B3 would be `=A2`, B4 would be `=A3`,
            # C2 would be `=B1`, C3 would be `=B2`, C4 would be `=B3`.
            #
            # To keep the formula&#x27;s ranges static, use the `$` indicator.
            # For example, use the formula `=$A$1` to prevent both the row and the
            # column from incrementing.
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `cell` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;range&quot;: { # A range on a sheet. # The range to repeat the cell in.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;cell&quot;: { # Data about a specific cell. # The data to write.
            &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                # is computed dynamically based on its data, grouping, filters, values,
                # etc. Only the top-left cell of the pivot table contains the pivot table
                # definition. The other cells will contain the calculated values of the
                # results of the pivot in their effective_value fields.
              &quot;rows&quot;: [ # Each row grouping in the pivot table.
                { # A single grouping (either row or column) in a pivot table.
                  &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                  &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                  &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                      # If not specified, sorting is alphabetical by this group&#x27;s values.
                    &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                        # grouping should be sorted by.
                    &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                        #
                        # For example, in a pivot table with one row group &amp; two column groups,
                        # the row group can list up to two values. The first value corresponds
                        # to a value within the first column group, and the second value
                        # corresponds to a value in the second column group.  If no values
                        # are listed, this would indicate that the row should be sorted according
                        # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                        # this would correspond to using the &quot;Total&quot; of that bucket.
                      { # The kinds of value that a cell in a spreadsheet can have.
                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                              # (in the spreadsheet&#x27;s locale).
                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                        },
                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                            # `&quot;123&quot;`.
                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # &quot;serial number&quot; format.
                      },
                    ],
                  },
                  &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                      # This is only valid for row groupings and is ignored by columns.
                      #
                      # By default, we minimize repitition of headings by not showing higher
                      # level headings where they are the same. For example, even though the
                      # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                      # it is redundant with previous rows. Setting repeat_headings to true
                      # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                      #
                      #     +--------------+
                      #     | Q1     | Jan |
                      #     |        | Feb |
                      #     |        | Mar |
                      #     +--------+-----+
                      #     | Q1 Total     |
                      #     +--------------+
                  &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                    { # Metadata about a value in a pivot grouping.
                      &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                      &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                          # (Note that formulaValue is not valid,
                          #  because the values will be calculated.)
                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                              # (in the spreadsheet&#x27;s locale).
                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                        },
                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                            # `&quot;123&quot;`.
                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # &quot;serial number&quot; format.
                      },
                    },
                  ],
                  &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                      #
                      # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                      # means this group refers to column `C`, whereas the offset `1` would
                      # refer to column `D`.
                  &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                      # in the source data column rather than breaking out each individual value.
                      # Only one PivotGroup with a group rule may be added for each column in
                      # the source data, though on any given column you may add both a
                      # PivotGroup that has a rule and a PivotGroup that does not.
                    &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                        # buckets of a constant size. All values from HistogramRule.start to
                        # HistogramRule.end are placed into groups of size
                        # HistogramRule.interval. In addition, all values below
                        # HistogramRule.start are placed in one group, and all values above
                        # HistogramRule.end are placed in another. Only
                        # HistogramRule.interval is required, though if HistogramRule.start
                        # and HistogramRule.end are both provided, HistogramRule.start must
                        # be less than HistogramRule.end. For example, a pivot table showing
                        # average purchase amount by age that has 50+ rows:
                        #
                        #     +-----+-------------------+
                        #     | Age | AVERAGE of Amount |
                        #     +-----+-------------------+
                        #     | 16  |            $27.13 |
                        #     | 17  |             $5.24 |
                        #     | 18  |            $20.15 |
                        #     ...
                        #     +-----+-------------------+
                        # could be turned into a pivot table that looks like the one below by
                        # applying a histogram group rule with a HistogramRule.start of 25,
                        # an HistogramRule.interval of 20, and an HistogramRule.end
                        # of 65.
                        #
                        #     +-------------+-------------------+
                        #     | Grouped Age | AVERAGE of Amount |
                        #     +-------------+-------------------+
                        #     | &lt; 25        |            $19.34 |
                        #     | 25-45       |            $31.43 |
                        #     | 45-65       |            $35.87 |
                        #     | &gt; 65        |            $27.55 |
                        #     +-------------+-------------------+
                        #     | Grand Total |            $29.12 |
                        #     +-------------+-------------------+
                      &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                          # of constant size. Values below start are lumped into a single bucket.
                          # This field is optional.
                      &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                          # of constant size. Values above end are lumped into a single bucket.
                          # This field is optional.
                      &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                    },
                    &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                        # buckets based on selected parts of their date or time values. For example,
                        # consider a pivot table showing sales transactions by date:
                        #
                        #     +----------+--------------+
                        #     | Date     | SUM of Sales |
                        #     +----------+--------------+
                        #     | 1/1/2017 |      $621.14 |
                        #     | 2/3/2017 |      $708.84 |
                        #     | 5/8/2017 |      $326.84 |
                        #     ...
                        #     +----------+--------------+
                        # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                        # results in the following pivot table.
                        #
                        #     +--------------+--------------+
                        #     | Grouped Date | SUM of Sales |
                        #     +--------------+--------------+
                        #     | 2017-Jan     |   $53,731.78 |
                        #     | 2017-Feb     |   $83,475.32 |
                        #     | 2017-Mar     |   $94,385.05 |
                        #     ...
                        #     +--------------+--------------+
                      &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                    },
                    &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                        # buckets with names of your choosing. For example, a pivot table that
                        # aggregates population by state:
                        #
                        #     +-------+-------------------+
                        #     | State | SUM of Population |
                        #     +-------+-------------------+
                        #     | AK    |               0.7 |
                        #     | AL    |               4.8 |
                        #     | AR    |               2.9 |
                        #     ...
                        #     +-------+-------------------+
                        # could be turned into a pivot table that aggregates population by time zone
                        # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                        # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                        # Note that a similar effect could be achieved by adding a time zone column
                        # to the source data and adjusting the pivot table.
                        #
                        #     +-----------+-------------------+
                        #     | Time Zone | SUM of Population |
                        #     +-----------+-------------------+
                        #     | Central   |             106.3 |
                        #     | Eastern   |             151.9 |
                        #     | Mountain  |              17.4 |
                        #     ...
                        #     +-----------+-------------------+
                      &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                          # that map to each group name.
                        { # A group name and a list of items from the source data that should be placed
                            # in the group with this name.
                          &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                              # item may be a string, number, or boolean. Items may appear in at most one
                              # group within a given ManualRule. Items that do not appear in any
                              # group will appear on their own.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                          &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                              # ManualRule must have a unique group name.
                            &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                # This field is read-only.
                              &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                  # (in the spreadsheet&#x27;s locale).
                              &quot;type&quot;: &quot;A String&quot;, # The type of error.
                            },
                            &quot;boolValue&quot;: True or False, # Represents a boolean value.
                            &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                # Leading single quotes are not included. For example, if the user typed
                                # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                # `&quot;123&quot;`.
                            &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                            &quot;numberValue&quot;: 3.14, # Represents a double value.
                                # Note: Dates, Times and DateTimes are represented as doubles in
                                # &quot;serial number&quot; format.
                          },
                        },
                      ],
                    },
                  },
                  &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                      # example, in the following pivot table, the row label is `Region` (which
                      # could be renamed to `State`) and the column label is `Product` (which
                      # could be renamed `Item`). Pivot tables created before December 2017 do
                      # not have header labels. If you&#x27;d like to add header labels to an existing
                      # pivot table, please delete the existing pivot table and then create a new
                      # pivot table with same parameters.
                      #
                      #     +--------------+---------+-------+
                      #     | SUM of Units | Product |       |
                      #     | Region       | Pen     | Paper |
                      #     +--------------+---------+-------+
                      #     | New York     |     345 |    98 |
                      #     | Oregon       |     234 |   123 |
                      #     | Tennessee    |     531 |   415 |
                      #     +--------------+---------+-------+
                      #     | Grand Total  |    1110 |   636 |
                      #     +--------------+---------+-------+
                },
              ],
              &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;values&quot;: [ # A list of values to include in the pivot table.
                { # The definition of how a value in a pivot table should be calculated.
                  &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                      # the result of a calculation with another pivot value. For example, if
                      # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                      # pivot values are displayed as the percentage of the grand total. In
                      # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                      # pivot table.
                  &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                      #
                      # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                      # means this value refers to column `C`, whereas the offset `1` would
                      # refer to column `D`.
                  &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                      # with an `=` character.
                  &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                      # If formula is set, the only supported values are
                      # SUM and
                      # CUSTOM.
                      # If sourceColumnOffset is set, then `CUSTOM`
                      # is not supported.
                  &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                },
              ],
              &quot;columns&quot;: [ # Each column grouping in the pivot table.
                { # A single grouping (either row or column) in a pivot table.
                  &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                  &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                  &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                      # If not specified, sorting is alphabetical by this group&#x27;s values.
                    &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                        # grouping should be sorted by.
                    &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                        #
                        # For example, in a pivot table with one row group &amp; two column groups,
                        # the row group can list up to two values. The first value corresponds
                        # to a value within the first column group, and the second value
                        # corresponds to a value in the second column group.  If no values
                        # are listed, this would indicate that the row should be sorted according
                        # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                        # this would correspond to using the &quot;Total&quot; of that bucket.
                      { # The kinds of value that a cell in a spreadsheet can have.
                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                              # (in the spreadsheet&#x27;s locale).
                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                        },
                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                            # `&quot;123&quot;`.
                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # &quot;serial number&quot; format.
                      },
                    ],
                  },
                  &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                      # This is only valid for row groupings and is ignored by columns.
                      #
                      # By default, we minimize repitition of headings by not showing higher
                      # level headings where they are the same. For example, even though the
                      # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                      # it is redundant with previous rows. Setting repeat_headings to true
                      # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                      #
                      #     +--------------+
                      #     | Q1     | Jan |
                      #     |        | Feb |
                      #     |        | Mar |
                      #     +--------+-----+
                      #     | Q1 Total     |
                      #     +--------------+
                  &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                    { # Metadata about a value in a pivot grouping.
                      &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                      &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                          # (Note that formulaValue is not valid,
                          #  because the values will be calculated.)
                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                              # (in the spreadsheet&#x27;s locale).
                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                        },
                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                            # `&quot;123&quot;`.
                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # &quot;serial number&quot; format.
                      },
                    },
                  ],
                  &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                      #
                      # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                      # means this group refers to column `C`, whereas the offset `1` would
                      # refer to column `D`.
                  &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                      # in the source data column rather than breaking out each individual value.
                      # Only one PivotGroup with a group rule may be added for each column in
                      # the source data, though on any given column you may add both a
                      # PivotGroup that has a rule and a PivotGroup that does not.
                    &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                        # buckets of a constant size. All values from HistogramRule.start to
                        # HistogramRule.end are placed into groups of size
                        # HistogramRule.interval. In addition, all values below
                        # HistogramRule.start are placed in one group, and all values above
                        # HistogramRule.end are placed in another. Only
                        # HistogramRule.interval is required, though if HistogramRule.start
                        # and HistogramRule.end are both provided, HistogramRule.start must
                        # be less than HistogramRule.end. For example, a pivot table showing
                        # average purchase amount by age that has 50+ rows:
                        #
                        #     +-----+-------------------+
                        #     | Age | AVERAGE of Amount |
                        #     +-----+-------------------+
                        #     | 16  |            $27.13 |
                        #     | 17  |             $5.24 |
                        #     | 18  |            $20.15 |
                        #     ...
                        #     +-----+-------------------+
                        # could be turned into a pivot table that looks like the one below by
                        # applying a histogram group rule with a HistogramRule.start of 25,
                        # an HistogramRule.interval of 20, and an HistogramRule.end
                        # of 65.
                        #
                        #     +-------------+-------------------+
                        #     | Grouped Age | AVERAGE of Amount |
                        #     +-------------+-------------------+
                        #     | &lt; 25        |            $19.34 |
                        #     | 25-45       |            $31.43 |
                        #     | 45-65       |            $35.87 |
                        #     | &gt; 65        |            $27.55 |
                        #     +-------------+-------------------+
                        #     | Grand Total |            $29.12 |
                        #     +-------------+-------------------+
                      &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                          # of constant size. Values below start are lumped into a single bucket.
                          # This field is optional.
                      &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                          # of constant size. Values above end are lumped into a single bucket.
                          # This field is optional.
                      &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                    },
                    &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                        # buckets based on selected parts of their date or time values. For example,
                        # consider a pivot table showing sales transactions by date:
                        #
                        #     +----------+--------------+
                        #     | Date     | SUM of Sales |
                        #     +----------+--------------+
                        #     | 1/1/2017 |      $621.14 |
                        #     | 2/3/2017 |      $708.84 |
                        #     | 5/8/2017 |      $326.84 |
                        #     ...
                        #     +----------+--------------+
                        # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                        # results in the following pivot table.
                        #
                        #     +--------------+--------------+
                        #     | Grouped Date | SUM of Sales |
                        #     +--------------+--------------+
                        #     | 2017-Jan     |   $53,731.78 |
                        #     | 2017-Feb     |   $83,475.32 |
                        #     | 2017-Mar     |   $94,385.05 |
                        #     ...
                        #     +--------------+--------------+
                      &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                    },
                    &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                        # buckets with names of your choosing. For example, a pivot table that
                        # aggregates population by state:
                        #
                        #     +-------+-------------------+
                        #     | State | SUM of Population |
                        #     +-------+-------------------+
                        #     | AK    |               0.7 |
                        #     | AL    |               4.8 |
                        #     | AR    |               2.9 |
                        #     ...
                        #     +-------+-------------------+
                        # could be turned into a pivot table that aggregates population by time zone
                        # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                        # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                        # Note that a similar effect could be achieved by adding a time zone column
                        # to the source data and adjusting the pivot table.
                        #
                        #     +-----------+-------------------+
                        #     | Time Zone | SUM of Population |
                        #     +-----------+-------------------+
                        #     | Central   |             106.3 |
                        #     | Eastern   |             151.9 |
                        #     | Mountain  |              17.4 |
                        #     ...
                        #     +-----------+-------------------+
                      &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                          # that map to each group name.
                        { # A group name and a list of items from the source data that should be placed
                            # in the group with this name.
                          &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                              # item may be a string, number, or boolean. Items may appear in at most one
                              # group within a given ManualRule. Items that do not appear in any
                              # group will appear on their own.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                          &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                              # ManualRule must have a unique group name.
                            &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                # This field is read-only.
                              &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                  # (in the spreadsheet&#x27;s locale).
                              &quot;type&quot;: &quot;A String&quot;, # The type of error.
                            },
                            &quot;boolValue&quot;: True or False, # Represents a boolean value.
                            &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                # Leading single quotes are not included. For example, if the user typed
                                # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                # `&quot;123&quot;`.
                            &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                            &quot;numberValue&quot;: 3.14, # Represents a double value.
                                # Note: Dates, Times and DateTimes are represented as doubles in
                                # &quot;serial number&quot; format.
                          },
                        },
                      ],
                    },
                  },
                  &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                      # example, in the following pivot table, the row label is `Region` (which
                      # could be renamed to `State`) and the column label is `Product` (which
                      # could be renamed `Item`). Pivot tables created before December 2017 do
                      # not have header labels. If you&#x27;d like to add header labels to an existing
                      # pivot table, please delete the existing pivot table and then create a new
                      # pivot table with same parameters.
                      #
                      #     +--------------+---------+-------+
                      #     | SUM of Units | Product |       |
                      #     | Region       | Pen     | Paper |
                      #     +--------------+---------+-------+
                      #     | New York     |     345 |    98 |
                      #     | Oregon       |     234 |   123 |
                      #     | Tennessee    |     531 |   415 |
                      #     +--------------+---------+-------+
                      #     | Grand Total  |    1110 |   636 |
                      #     +--------------+---------+-------+
                },
              ],
              &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                  # or vertically (as rows).
              &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                  #
                  # The filters are applied before aggregating data into the pivot table.
                  # The map&#x27;s key is the column offset of the source range that you want to
                  # filter, and the value is the criteria for that column.
                  #
                  # For example, if the source was `C10:E15`, a key of `0` will have the filter
                  # for column `C`, whereas the key `1` is for column `D`.
                &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                  &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                    &quot;A String&quot;,
                  ],
                },
              },
            },
            &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                # This is the value as it&#x27;s shown to the user.
                # This field is read-only.
            &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                # on user entered strings, not formulas, bools, or numbers.
                # Runs start at specific indexes in the text and continue until the next
                # run. Properties of a run will continue unless explicitly changed
                # in a subsequent run (and properties of the first run will continue
                # the properties of the cell unless explicitly changed).
                #
                # When writing, the new runs will overwrite any prior runs.  When writing a
                # new user_entered_value, previous runs are erased.
              { # A run of a text format. The format of this run continues until the start
                  # index of the next run.
                  # When updating, all fields must be set.
                &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;startIndex&quot;: 42, # The character index where this run starts.
              },
            ],
            &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                # the calculated value.  For cells with literals, this is
                # the same as the user_entered_value.
                # This field is read-only.
              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                  # This field is read-only.
                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                    # (in the spreadsheet&#x27;s locale).
                &quot;type&quot;: &quot;A String&quot;, # The type of error.
              },
              &quot;boolValue&quot;: True or False, # Represents a boolean value.
              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                  # Leading single quotes are not included. For example, if the user typed
                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                  # `&quot;123&quot;`.
              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
              &quot;numberValue&quot;: 3.14, # Represents a double value.
                  # Note: Dates, Times and DateTimes are represented as doubles in
                  # &quot;serial number&quot; format.
            },
            &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                # This includes the results of applying any conditional formatting and,
                # if the cell contains a formula, the computed number format.
                # If the effective format is the default format, effective format will
                # not be written.
                # This field is read-only.
              &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
              &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
              &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
              &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user&#x27;s locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                    # more information about the supported patterns.
                &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                    # When writing, this field must be set.
              },
              &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
              },
              &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                    # Measured in degrees. Valid values are between -90 and 90. Positive
                    # angles are angled upwards, negative are angled downwards.
                    #
                    # Note: For LTR text direction positive angles are in the
                    # counterclockwise direction, whereas for RTL they are in the clockwise
                    # direction
                &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                    # characters is unchanged.
                    # For example:
                    #
                    #     | V |
                    #     | e |
                    #     | r |
                    #     | t |
                    #     | i |
                    #     | c |
                    #     | a |
                    #     | l |
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                &quot;right&quot;: 42, # The right padding of the cell.
                &quot;bottom&quot;: 42, # The bottom padding of the cell.
                &quot;left&quot;: 42, # The left padding of the cell.
                &quot;top&quot;: 42, # The top padding of the cell.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
            &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                #
                # When writing, the new format will be merged with the existing format.
              &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
              &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
              &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
              &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user&#x27;s locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                    # more information about the supported patterns.
                &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                    # When writing, this field must be set.
              },
              &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
              },
              &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                    # Measured in degrees. Valid values are between -90 and 90. Positive
                    # angles are angled upwards, negative are angled downwards.
                    #
                    # Note: For LTR text direction positive angles are in the
                    # counterclockwise direction, whereas for RTL they are in the clockwise
                    # direction
                &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                    # characters is unchanged.
                    # For example:
                    #
                    #     | V |
                    #     | e |
                    #     | r |
                    #     | t |
                    #     | i |
                    #     | c |
                    #     | a |
                    #     | l |
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                &quot;right&quot;: 42, # The right padding of the cell.
                &quot;bottom&quot;: 42, # The bottom padding of the cell.
                &quot;left&quot;: 42, # The left padding of the cell.
                &quot;top&quot;: 42, # The top padding of the cell.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                # Note: Dates, Times and DateTimes are represented as doubles in
                # serial number format.
              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                  # This field is read-only.
                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                    # (in the spreadsheet&#x27;s locale).
                &quot;type&quot;: &quot;A String&quot;, # The type of error.
              },
              &quot;boolValue&quot;: True or False, # Represents a boolean value.
              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                  # Leading single quotes are not included. For example, if the user typed
                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                  # `&quot;123&quot;`.
              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
              &quot;numberValue&quot;: 3.14, # Represents a double value.
                  # Note: Dates, Times and DateTimes are represented as doubles in
                  # &quot;serial number&quot; format.
            },
            &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                #
                # When writing, the new data validation rule will overwrite any prior rule.
              &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                  # If true, &quot;List&quot; conditions will show a dropdown.
              &quot;strict&quot;: True or False, # True if invalid data should be rejected.
              &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
            },
            &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                # in the userEnteredValue.formulaValue
                # field.)
          },
        },
        &quot;deleteConditionalFormatRule&quot;: { # Deletes a conditional format rule at the given index. # Deletes an existing conditional format rule.
            # All subsequent rules&#x27; indexes are decremented.
          &quot;sheetId&quot;: 42, # The sheet the rule is being deleted from.
          &quot;index&quot;: 42, # The zero-based index of the rule to be deleted.
        },
        &quot;deleteProtectedRange&quot;: { # Deletes the protected range with the given ID. # Deletes a protected range.
          &quot;protectedRangeId&quot;: 42, # The ID of the protected range to delete.
        },
        &quot;deleteDuplicates&quot;: { # Removes rows within this range that contain values in the specified columns # Removes rows containing duplicate values in specified columns of a cell
            # range.
            # that are duplicates of values in any previous row. Rows with identical values
            # but different letter cases, formatting, or formulas are considered to be
            # duplicates.
            #
            # This request also removes duplicate rows hidden from view (for example, due
            # to a filter). When removing duplicates, the first instance of each duplicate
            # row scanning from the top downwards is kept in the resulting range. Content
            # outside of the specified range isn&#x27;t removed, and rows considered duplicates
            # do not have to be adjacent to each other in the range.
          &quot;range&quot;: { # A range on a sheet. # The range to remove duplicates rows from.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;comparisonColumns&quot;: [ # The columns in the range to analyze for duplicate values. If no columns are
              # selected then all columns are analyzed for duplicates.
            { # A range along a single dimension on a sheet.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          ],
        },
        &quot;updateSpreadsheetProperties&quot;: { # Updates properties of a spreadsheet. # Updates the spreadsheet&#x27;s properties.
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root &#x27;properties&#x27; is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;properties&quot;: { # Properties of a spreadsheet. # The properties to update.
            &quot;title&quot;: &quot;A String&quot;, # The title of the spreadsheet.
            &quot;defaultFormat&quot;: { # The format of a cell. # The default format of all cells in the spreadsheet.
                # CellData.effectiveFormat will not be set if
                # the cell&#x27;s format is equal to this default format. This field is read-only.
              &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
              &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
              &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
              &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user&#x27;s locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                    # more information about the supported patterns.
                &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                    # When writing, this field must be set.
              },
              &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
              },
              &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                    # Measured in degrees. Valid values are between -90 and 90. Positive
                    # angles are angled upwards, negative are angled downwards.
                    #
                    # Note: For LTR text direction positive angles are in the
                    # counterclockwise direction, whereas for RTL they are in the clockwise
                    # direction
                &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                    # characters is unchanged.
                    # For example:
                    #
                    #     | V |
                    #     | e |
                    #     | r |
                    #     | t |
                    #     | i |
                    #     | c |
                    #     | a |
                    #     | l |
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                &quot;right&quot;: 42, # The right padding of the cell.
                &quot;bottom&quot;: 42, # The bottom padding of the cell.
                &quot;left&quot;: 42, # The left padding of the cell.
                &quot;top&quot;: 42, # The top padding of the cell.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;autoRecalc&quot;: &quot;A String&quot;, # The amount of time to wait before volatile functions are recalculated.
            &quot;iterativeCalculationSettings&quot;: { # Settings to control how circular dependencies are resolved with iterative # Determines whether and how circular references are resolved with iterative
                # calculation.  Absence of this field means that circular references result
                # in calculation errors.
                # calculation.
              &quot;maxIterations&quot;: 42, # When iterative calculation is enabled, the maximum number of calculation
                  # rounds to perform.
              &quot;convergenceThreshold&quot;: 3.14, # When iterative calculation is enabled and successive results differ by
                  # less than this threshold value, the calculation rounds stop.
            },
            &quot;timeZone&quot;: &quot;A String&quot;, # The time zone of the spreadsheet, in CLDR format such as
                # `America/New_York`. If the time zone isn&#x27;t recognized, this may
                # be a custom time zone such as `GMT-07:00`.
            &quot;spreadsheetTheme&quot;: { # Represents spreadsheet theme # Theme applied to the spreadsheet.
              &quot;primaryFontFamily&quot;: &quot;A String&quot;, # / Name of the primary font family.
              &quot;themeColors&quot;: [ # The spreadsheet theme color pairs. To update you must provide all theme
                  # color pairs.
                { # A pair mapping a spreadsheet theme color type to the concrete color it
                    # represents.
                  &quot;colorType&quot;: &quot;A String&quot;, # The type of the spreadsheet theme color.
                  &quot;color&quot;: { # A color value. # The concrete color corresponding to the theme color type.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                },
              ],
            },
            &quot;locale&quot;: &quot;A String&quot;, # The locale of the spreadsheet in one of the following formats:
                #
                # * an ISO 639-1 language code such as `en`
                #
                # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
                #
                # * a combination of the ISO language code and country code, such as `en_US`
                #
                # Note: when updating this field, not all locales/languages are supported.
          },
        },
        &quot;addFilterView&quot;: { # Adds a filter view. # Adds a filter view.
          &quot;filter&quot;: { # A filter view. # The filter to add. The filterViewId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a filter that already exists.)
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
        },
        &quot;updateCells&quot;: { # Updates all cells in a range with new data. # Updates many cells at once.
          &quot;start&quot;: { # A coordinate in a sheet. # The coordinate to start writing data at.
              # Any number of rows and columns (including a different number of
              # columns per row) may be written.
              # All indexes are zero-based.
            &quot;columnIndex&quot;: 42, # The column index of the coordinate.
            &quot;rowIndex&quot;: 42, # The row index of the coordinate.
            &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
          },
          &quot;rows&quot;: [ # The data to write.
            { # Data about each cell in a row.
              &quot;values&quot;: [ # The values in the row, one per column.
                { # Data about a specific cell.
                  &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                      # is computed dynamically based on its data, grouping, filters, values,
                      # etc. Only the top-left cell of the pivot table contains the pivot table
                      # definition. The other cells will contain the calculated values of the
                      # results of the pivot in their effective_value fields.
                    &quot;rows&quot;: [ # Each row grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                        &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                        &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group&#x27;s values.
                          &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                          &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group &amp; two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                              # this would correspond to using the &quot;Total&quot; of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                        },
                        &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                            # This is only valid for row groupings and is ignored by columns.
                            #
                            # By default, we minimize repitition of headings by not showing higher
                            # level headings where they are the same. For example, even though the
                            # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                            # it is redundant with previous rows. Setting repeat_headings to true
                            # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                            #
                            #     +--------------+
                            #     | Q1     | Jan |
                            #     |        | Feb |
                            #     |        | Mar |
                            #     +--------+-----+
                            #     | Q1 Total     |
                            #     +--------------+
                        &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                            &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          },
                        ],
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                            # in the source data column rather than breaking out each individual value.
                            # Only one PivotGroup with a group rule may be added for each column in
                            # the source data, though on any given column you may add both a
                            # PivotGroup that has a rule and a PivotGroup that does not.
                          &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                              # buckets of a constant size. All values from HistogramRule.start to
                              # HistogramRule.end are placed into groups of size
                              # HistogramRule.interval. In addition, all values below
                              # HistogramRule.start are placed in one group, and all values above
                              # HistogramRule.end are placed in another. Only
                              # HistogramRule.interval is required, though if HistogramRule.start
                              # and HistogramRule.end are both provided, HistogramRule.start must
                              # be less than HistogramRule.end. For example, a pivot table showing
                              # average purchase amount by age that has 50+ rows:
                              #
                              #     +-----+-------------------+
                              #     | Age | AVERAGE of Amount |
                              #     +-----+-------------------+
                              #     | 16  |            $27.13 |
                              #     | 17  |             $5.24 |
                              #     | 18  |            $20.15 |
                              #     ...
                              #     +-----+-------------------+
                              # could be turned into a pivot table that looks like the one below by
                              # applying a histogram group rule with a HistogramRule.start of 25,
                              # an HistogramRule.interval of 20, and an HistogramRule.end
                              # of 65.
                              #
                              #     +-------------+-------------------+
                              #     | Grouped Age | AVERAGE of Amount |
                              #     +-------------+-------------------+
                              #     | &lt; 25        |            $19.34 |
                              #     | 25-45       |            $31.43 |
                              #     | 45-65       |            $35.87 |
                              #     | &gt; 65        |            $27.55 |
                              #     +-------------+-------------------+
                              #     | Grand Total |            $29.12 |
                              #     +-------------+-------------------+
                            &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                # of constant size. Values below start are lumped into a single bucket.
                                # This field is optional.
                            &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                # of constant size. Values above end are lumped into a single bucket.
                                # This field is optional.
                            &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                          },
                          &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                              # buckets based on selected parts of their date or time values. For example,
                              # consider a pivot table showing sales transactions by date:
                              #
                              #     +----------+--------------+
                              #     | Date     | SUM of Sales |
                              #     +----------+--------------+
                              #     | 1/1/2017 |      $621.14 |
                              #     | 2/3/2017 |      $708.84 |
                              #     | 5/8/2017 |      $326.84 |
                              #     ...
                              #     +----------+--------------+
                              # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                              # results in the following pivot table.
                              #
                              #     +--------------+--------------+
                              #     | Grouped Date | SUM of Sales |
                              #     +--------------+--------------+
                              #     | 2017-Jan     |   $53,731.78 |
                              #     | 2017-Feb     |   $83,475.32 |
                              #     | 2017-Mar     |   $94,385.05 |
                              #     ...
                              #     +--------------+--------------+
                            &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                          },
                          &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                              # buckets with names of your choosing. For example, a pivot table that
                              # aggregates population by state:
                              #
                              #     +-------+-------------------+
                              #     | State | SUM of Population |
                              #     +-------+-------------------+
                              #     | AK    |               0.7 |
                              #     | AL    |               4.8 |
                              #     | AR    |               2.9 |
                              #     ...
                              #     +-------+-------------------+
                              # could be turned into a pivot table that aggregates population by time zone
                              # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                              # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                              # Note that a similar effect could be achieved by adding a time zone column
                              # to the source data and adjusting the pivot table.
                              #
                              #     +-----------+-------------------+
                              #     | Time Zone | SUM of Population |
                              #     +-----------+-------------------+
                              #     | Central   |             106.3 |
                              #     | Eastern   |             151.9 |
                              #     | Mountain  |              17.4 |
                              #     ...
                              #     +-----------+-------------------+
                            &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                # that map to each group name.
                              { # A group name and a list of items from the source data that should be placed
                                  # in the group with this name.
                                &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                    # item may be a string, number, or boolean. Items may appear in at most one
                                    # group within a given ManualRule. Items that do not appear in any
                                    # group will appear on their own.
                                  { # The kinds of value that a cell in a spreadsheet can have.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                ],
                                &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                    # ManualRule must have a unique group name.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                          },
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                            # example, in the following pivot table, the row label is `Region` (which
                            # could be renamed to `State`) and the column label is `Product` (which
                            # could be renamed `Item`). Pivot tables created before December 2017 do
                            # not have header labels. If you&#x27;d like to add header labels to an existing
                            # pivot table, please delete the existing pivot table and then create a new
                            # pivot table with same parameters.
                            #
                            #     +--------------+---------+-------+
                            #     | SUM of Units | Product |       |
                            #     | Region       | Pen     | Paper |
                            #     +--------------+---------+-------+
                            #     | New York     |     345 |    98 |
                            #     | Oregon       |     234 |   123 |
                            #     | Tennessee    |     531 |   415 |
                            #     +--------------+---------+-------+
                            #     | Grand Total  |    1110 |   636 |
                            #     +--------------+---------+-------+
                      },
                    ],
                    &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                    &quot;values&quot;: [ # A list of values to include in the pivot table.
                      { # The definition of how a value in a pivot table should be calculated.
                        &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                            # the result of a calculation with another pivot value. For example, if
                            # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                            # pivot values are displayed as the percentage of the grand total. In
                            # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                            # pivot table.
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this value refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                            # with an `=` character.
                        &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                            # If formula is set, the only supported values are
                            # SUM and
                            # CUSTOM.
                            # If sourceColumnOffset is set, then `CUSTOM`
                            # is not supported.
                        &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                      },
                    ],
                    &quot;columns&quot;: [ # Each column grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                        &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                        &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group&#x27;s values.
                          &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                          &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group &amp; two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                              # this would correspond to using the &quot;Total&quot; of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                        },
                        &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                            # This is only valid for row groupings and is ignored by columns.
                            #
                            # By default, we minimize repitition of headings by not showing higher
                            # level headings where they are the same. For example, even though the
                            # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                            # it is redundant with previous rows. Setting repeat_headings to true
                            # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                            #
                            #     +--------------+
                            #     | Q1     | Jan |
                            #     |        | Feb |
                            #     |        | Mar |
                            #     +--------+-----+
                            #     | Q1 Total     |
                            #     +--------------+
                        &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                            &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          },
                        ],
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                            # in the source data column rather than breaking out each individual value.
                            # Only one PivotGroup with a group rule may be added for each column in
                            # the source data, though on any given column you may add both a
                            # PivotGroup that has a rule and a PivotGroup that does not.
                          &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                              # buckets of a constant size. All values from HistogramRule.start to
                              # HistogramRule.end are placed into groups of size
                              # HistogramRule.interval. In addition, all values below
                              # HistogramRule.start are placed in one group, and all values above
                              # HistogramRule.end are placed in another. Only
                              # HistogramRule.interval is required, though if HistogramRule.start
                              # and HistogramRule.end are both provided, HistogramRule.start must
                              # be less than HistogramRule.end. For example, a pivot table showing
                              # average purchase amount by age that has 50+ rows:
                              #
                              #     +-----+-------------------+
                              #     | Age | AVERAGE of Amount |
                              #     +-----+-------------------+
                              #     | 16  |            $27.13 |
                              #     | 17  |             $5.24 |
                              #     | 18  |            $20.15 |
                              #     ...
                              #     +-----+-------------------+
                              # could be turned into a pivot table that looks like the one below by
                              # applying a histogram group rule with a HistogramRule.start of 25,
                              # an HistogramRule.interval of 20, and an HistogramRule.end
                              # of 65.
                              #
                              #     +-------------+-------------------+
                              #     | Grouped Age | AVERAGE of Amount |
                              #     +-------------+-------------------+
                              #     | &lt; 25        |            $19.34 |
                              #     | 25-45       |            $31.43 |
                              #     | 45-65       |            $35.87 |
                              #     | &gt; 65        |            $27.55 |
                              #     +-------------+-------------------+
                              #     | Grand Total |            $29.12 |
                              #     +-------------+-------------------+
                            &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                # of constant size. Values below start are lumped into a single bucket.
                                # This field is optional.
                            &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                # of constant size. Values above end are lumped into a single bucket.
                                # This field is optional.
                            &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                          },
                          &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                              # buckets based on selected parts of their date or time values. For example,
                              # consider a pivot table showing sales transactions by date:
                              #
                              #     +----------+--------------+
                              #     | Date     | SUM of Sales |
                              #     +----------+--------------+
                              #     | 1/1/2017 |      $621.14 |
                              #     | 2/3/2017 |      $708.84 |
                              #     | 5/8/2017 |      $326.84 |
                              #     ...
                              #     +----------+--------------+
                              # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                              # results in the following pivot table.
                              #
                              #     +--------------+--------------+
                              #     | Grouped Date | SUM of Sales |
                              #     +--------------+--------------+
                              #     | 2017-Jan     |   $53,731.78 |
                              #     | 2017-Feb     |   $83,475.32 |
                              #     | 2017-Mar     |   $94,385.05 |
                              #     ...
                              #     +--------------+--------------+
                            &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                          },
                          &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                              # buckets with names of your choosing. For example, a pivot table that
                              # aggregates population by state:
                              #
                              #     +-------+-------------------+
                              #     | State | SUM of Population |
                              #     +-------+-------------------+
                              #     | AK    |               0.7 |
                              #     | AL    |               4.8 |
                              #     | AR    |               2.9 |
                              #     ...
                              #     +-------+-------------------+
                              # could be turned into a pivot table that aggregates population by time zone
                              # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                              # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                              # Note that a similar effect could be achieved by adding a time zone column
                              # to the source data and adjusting the pivot table.
                              #
                              #     +-----------+-------------------+
                              #     | Time Zone | SUM of Population |
                              #     +-----------+-------------------+
                              #     | Central   |             106.3 |
                              #     | Eastern   |             151.9 |
                              #     | Mountain  |              17.4 |
                              #     ...
                              #     +-----------+-------------------+
                            &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                # that map to each group name.
                              { # A group name and a list of items from the source data that should be placed
                                  # in the group with this name.
                                &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                    # item may be a string, number, or boolean. Items may appear in at most one
                                    # group within a given ManualRule. Items that do not appear in any
                                    # group will appear on their own.
                                  { # The kinds of value that a cell in a spreadsheet can have.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                ],
                                &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                    # ManualRule must have a unique group name.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                          },
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                            # example, in the following pivot table, the row label is `Region` (which
                            # could be renamed to `State`) and the column label is `Product` (which
                            # could be renamed `Item`). Pivot tables created before December 2017 do
                            # not have header labels. If you&#x27;d like to add header labels to an existing
                            # pivot table, please delete the existing pivot table and then create a new
                            # pivot table with same parameters.
                            #
                            #     +--------------+---------+-------+
                            #     | SUM of Units | Product |       |
                            #     | Region       | Pen     | Paper |
                            #     +--------------+---------+-------+
                            #     | New York     |     345 |    98 |
                            #     | Oregon       |     234 |   123 |
                            #     | Tennessee    |     531 |   415 |
                            #     +--------------+---------+-------+
                            #     | Grand Total  |    1110 |   636 |
                            #     +--------------+---------+-------+
                      },
                    ],
                    &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                        # or vertically (as rows).
                    &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                        #
                        # The filters are applied before aggregating data into the pivot table.
                        # The map&#x27;s key is the column offset of the source range that you want to
                        # filter, and the value is the criteria for that column.
                        #
                        # For example, if the source was `C10:E15`, a key of `0` will have the filter
                        # for column `C`, whereas the key `1` is for column `D`.
                      &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                        &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                          &quot;A String&quot;,
                        ],
                      },
                    },
                  },
                  &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                      # This is the value as it&#x27;s shown to the user.
                      # This field is read-only.
                  &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                      # on user entered strings, not formulas, bools, or numbers.
                      # Runs start at specific indexes in the text and continue until the next
                      # run. Properties of a run will continue unless explicitly changed
                      # in a subsequent run (and properties of the first run will continue
                      # the properties of the cell unless explicitly changed).
                      #
                      # When writing, the new runs will overwrite any prior runs.  When writing a
                      # new user_entered_value, previous runs are erased.
                    { # A run of a text format. The format of this run continues until the start
                        # index of the next run.
                        # When updating, all fields must be set.
                      &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;startIndex&quot;: 42, # The character index where this run starts.
                    },
                  ],
                  &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                      # the calculated value.  For cells with literals, this is
                      # the same as the user_entered_value.
                      # This field is read-only.
                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                          # (in the spreadsheet&#x27;s locale).
                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                    },
                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                        # `&quot;123&quot;`.
                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # &quot;serial number&quot; format.
                  },
                  &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                      # This includes the results of applying any conditional formatting and,
                      # if the cell contains a formula, the computed number format.
                      # If the effective format is the default format, effective format will
                      # not be written.
                      # This field is read-only.
                    &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                    &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                    &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                    &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                      &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user&#x27;s locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                          # more information about the supported patterns.
                      &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                          # When writing, this field must be set.
                    },
                    &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                      &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                    },
                    &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                      &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                          # Measured in degrees. Valid values are between -90 and 90. Positive
                          # angles are angled upwards, negative are angled downwards.
                          #
                          # Note: For LTR text direction positive angles are in the
                          # counterclockwise direction, whereas for RTL they are in the clockwise
                          # direction
                      &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                          # characters is unchanged.
                          # For example:
                          #
                          #     | V |
                          #     | e |
                          #     | r |
                          #     | t |
                          #     | i |
                          #     | c |
                          #     | a |
                          #     | l |
                    },
                    &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                        # If background_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      &quot;right&quot;: 42, # The right padding of the cell.
                      &quot;bottom&quot;: 42, # The bottom padding of the cell.
                      &quot;left&quot;: 42, # The left padding of the cell.
                      &quot;top&quot;: 42, # The top padding of the cell.
                    },
                    &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                  &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                      #
                      # When writing, the new format will be merged with the existing format.
                    &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                    &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                    &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                    &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                      &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user&#x27;s locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                          # more information about the supported patterns.
                      &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                          # When writing, this field must be set.
                    },
                    &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                      &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                    },
                    &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                      &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                          # Measured in degrees. Valid values are between -90 and 90. Positive
                          # angles are angled upwards, negative are angled downwards.
                          #
                          # Note: For LTR text direction positive angles are in the
                          # counterclockwise direction, whereas for RTL they are in the clockwise
                          # direction
                      &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                          # characters is unchanged.
                          # For example:
                          #
                          #     | V |
                          #     | e |
                          #     | r |
                          #     | t |
                          #     | i |
                          #     | c |
                          #     | a |
                          #     | l |
                    },
                    &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                        # If background_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      &quot;right&quot;: 42, # The right padding of the cell.
                      &quot;bottom&quot;: 42, # The bottom padding of the cell.
                      &quot;left&quot;: 42, # The left padding of the cell.
                      &quot;top&quot;: 42, # The top padding of the cell.
                    },
                    &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                      # Note: Dates, Times and DateTimes are represented as doubles in
                      # serial number format.
                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                          # (in the spreadsheet&#x27;s locale).
                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                    },
                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                        # `&quot;123&quot;`.
                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # &quot;serial number&quot; format.
                  },
                  &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                      #
                      # When writing, the new data validation rule will overwrite any prior rule.
                    &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                        # If true, &quot;List&quot; conditions will show a dropdown.
                    &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                    &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                    &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                        # BooleanConditions are used by conditional formatting,
                        # data validation, and the criteria in filters.
                      &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                          # on the condition type.  Some support zero values,
                          # others one or two values,
                          # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                        { # The value of the condition.
                          &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                              # Valid only if the type is
                              # DATE_BEFORE,
                              # DATE_AFTER,
                              # DATE_ON_OR_BEFORE or
                              # DATE_ON_OR_AFTER.
                              #
                              # Relative dates are not supported in data validation.
                              # They are supported only in conditional formatting and
                              # conditional filters.
                          &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                              # The value is parsed as if the user typed into a cell.
                              # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                        },
                      ],
                      &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                    },
                  },
                  &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                      # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                      # in the userEnteredValue.formulaValue
                      # field.)
                },
              ],
            },
          ],
          &quot;fields&quot;: &quot;A String&quot;, # The fields of CellData that should be updated.
              # At least one field must be specified.
              # The root is the CellData; &#x27;row.values.&#x27; should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;range&quot;: { # A range on a sheet. # The range to write data to.
              #
              # If the data in rows does not cover the entire requested range,
              # the fields matching those set in fields will be cleared.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;setBasicFilter&quot;: { # Sets the basic filter associated with a sheet. # Sets the basic filter on a sheet.
          &quot;filter&quot;: { # The default filter associated with a sheet. # The filter to set.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range the filter covers.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
          },
        },
        &quot;findReplace&quot;: { # Finds and replaces data in cells over a range, sheet, or all sheets. # Finds and replaces occurrences of some text with other text.
          &quot;replacement&quot;: &quot;A String&quot;, # The value to use as the replacement.
          &quot;matchEntireCell&quot;: True or False, # True if the find value should match the entire cell.
          &quot;includeFormulas&quot;: True or False, # True if the search should include cells with formulas.
              # False to skip cells with formulas.
          &quot;matchCase&quot;: True or False, # True if the search is case sensitive.
          &quot;find&quot;: &quot;A String&quot;, # The value to search.
          &quot;searchByRegex&quot;: True or False, # True if the find value is a regex.
              # The regular expression and replacement should follow Java regex rules
              # at https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html.
              # The replacement string is allowed to refer to capturing groups.
              # For example, if one cell has the contents `&quot;Google Sheets&quot;` and another
              # has `&quot;Google Docs&quot;`, then searching for `&quot;o.* (.*)&quot;` with a replacement of
              # `&quot;$1 Rocks&quot;` would change the contents of the cells to
              # `&quot;GSheets Rocks&quot;` and `&quot;GDocs Rocks&quot;` respectively.
          &quot;range&quot;: { # A range on a sheet. # The range to find/replace over.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;allSheets&quot;: True or False, # True to find/replace over all sheets.
          &quot;sheetId&quot;: 42, # The sheet to find/replace over.
        },
        &quot;updateSlicerSpec&quot;: { # Updates a slicer&#x27;s specifications. # Updates a slicer&#x27;s specifications.
            # (This does not move or resize a slicer. To move or resize a slicer use
            # UpdateEmbeddedObjectPositionRequest.
          &quot;spec&quot;: { # The specifications of a slicer. # The specification to apply to the slicer.
            &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
              &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                  # shown. Mutually exclusive with visible_foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hidden_values -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                  # are shown. Mutually exclusive with visible_background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                  # shown. This field is mutually exclusive with visible_foreground_color,
                  # and must be set to an RGB-type color. If visible_background_color is
                  # also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                  # are shown. This field is mutually exclusive with
                  # visible_background_color, and must be set to an RGB-type color. If
                  # visible_foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;hiddenValues&quot;: [ # Values that should be hidden.
                &quot;A String&quot;,
              ],
            },
            &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                # Absent values indicate that the field isn&#x27;t specified.
              &quot;fontSize&quot;: 42, # The size of the font.
              &quot;underline&quot;: True or False, # True if the text is underlined.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                  # If foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;bold&quot;: True or False, # True if the text is bold.
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;italic&quot;: True or False, # True if the text is italicized.
              &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
            },
            &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
            &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                # If background_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                # If not set, default to `True`.
            &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
            &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                # If unspecified, defaults to `LEFT`
            &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `SlicerSpec` is implied and should not be specified. A single &quot;*&quot;`
              # can be used as short-hand for listing every field.
          &quot;slicerId&quot;: 42, # The id of the slicer to update.
        },
        &quot;unmergeCells&quot;: { # Unmerges cells in the given range. # Unmerges merged cells.
          &quot;range&quot;: { # A range on a sheet. # The range within which all cells should be unmerged.
              # If the range spans multiple merges, all will be unmerged.
              # The range must not partially span any merge.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;addSheet&quot;: { # Adds a new sheet. # Adds a sheet.
            # When a sheet is added at a given index,
            # all subsequent sheets&#x27; indexes are incremented.
            # To add an object sheet, use AddChartRequest instead and specify
            # EmbeddedObjectPosition.sheetId or
            # EmbeddedObjectPosition.newSheet.
          &quot;properties&quot;: { # Properties of a sheet. # The properties the new sheet should have.
              # All properties are optional.
              # The sheetId field is optional; if one is not
              # set, an id will be randomly generated. (It is an error to specify the ID
              # of a sheet that already exists.)
            &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet is added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in &quot;before the move&quot; indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request is ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
            &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
              &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
              &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
              &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
              &quot;rowCount&quot;: 42, # The number of rows in the grid.
              &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
              &quot;columnCount&quot;: 42, # The number of columns in the grid.
            },
            &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
            &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
                # If tab_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
            &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
          },
        },
        &quot;addBanding&quot;: { # Adds a new banded range to the spreadsheet. # Adds a new banded range
          &quot;bandedRange&quot;: { # A banded (alternating colors) range in a sheet. # The banded range to add. The bandedRangeId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a range that already exists.)
            &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;bandedRangeId&quot;: 42, # The id of the banded range.
            &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          },
        },
        &quot;updateSheetProperties&quot;: { # Updates properties of the sheet with the specified # Updates a sheet&#x27;s properties.
            # sheetId.
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `properties` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;properties&quot;: { # Properties of a sheet. # The properties to update.
            &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet is added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in &quot;before the move&quot; indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request is ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
            &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
              &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
              &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
              &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
              &quot;rowCount&quot;: 42, # The number of rows in the grid.
              &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
              &quot;columnCount&quot;: 42, # The number of columns in the grid.
            },
            &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
            &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
                # If tab_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
            &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
          },
        },
        &quot;insertRange&quot;: { # Inserts cells into a range, shifting the existing cells over or down. # Inserts new cells in a sheet, shifting the existing cells.
          &quot;range&quot;: { # A range on a sheet. # The range to insert new cells into.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;shiftDimension&quot;: &quot;A String&quot;, # The dimension which will be shifted when inserting cells.
              # If ROWS, existing cells will be shifted down.
              # If COLUMNS, existing cells will be shifted right.
        },
        &quot;deleteEmbeddedObject&quot;: { # Deletes the embedded object with the given ID. # Deletes an embedded object (e.g, chart, image) in a sheet.
          &quot;objectId&quot;: 42, # The ID of the embedded object to delete.
        },
        &quot;updateNamedRange&quot;: { # Updates properties of the named range with the specified # Updates a named range.
            # namedRangeId.
          &quot;namedRange&quot;: { # A named range. # The named range to update with the new properties.
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
            &quot;range&quot;: { # A range on a sheet. # The range this represents.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
          },
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `namedRange` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
        },
        &quot;autoResizeDimensions&quot;: { # Automatically resizes one or more dimensions based on the contents # Automatically resizes one or more dimensions based on the contents
            # of the cells in that dimension.
            # of the cells in that dimension.
          &quot;dimensions&quot;: { # A range along a single dimension on a sheet. # The dimensions to automatically resize.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
        &quot;deleteDeveloperMetadata&quot;: { # A request to delete developer metadata. # Deletes developer metadata
          &quot;dataFilter&quot;: { # Filter that describes what data should be selected or returned from a # The data filter describing the criteria used to select which developer
              # metadata entry to delete.
              # request.
            &quot;gridRange&quot;: { # A range on a sheet. # Selects data that matches the range described by the GridRange.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;developerMetadataLookup&quot;: { # Selects DeveloperMetadata that matches all of the specified fields.  For # Selects data associated with the developer metadata matching the criteria
                # described by this DeveloperMetadataLookup.
                # example, if only a metadata ID is specified this considers the
                # DeveloperMetadata with that particular unique ID. If a metadata key is
                # specified, this considers all developer metadata with that key.  If a
                # key, visibility, and location type are all specified, this considers all
                # developer metadata with that key and visibility that are associated with a
                # location of that type.  In general, this
                # selects all DeveloperMetadata that matches the intersection of all the
                # specified fields; any field or combination of fields may be specified.
              &quot;metadataLocation&quot;: { # A location where metadata may be associated in a spreadsheet. # Limits the selected developer metadata to those entries associated with
                  # the specified location.  This field either matches exact locations or all
                  # intersecting locations according the specified
                  # locationMatchingStrategy.
                &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                    # a dimension. The specified DimensionRange must represent a single row
                    # or column; it cannot be unbounded or span multiple rows or columns.
                    # All indexes are zero-based.
                    # Indexes are half open: the start index is inclusive
                    # and the end index is exclusive.
                    # Missing indexes indicate the range is unbounded on that side.
                  &quot;sheetId&quot;: 42, # The sheet this span is on.
                  &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                  &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                  &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                },
              },
              &quot;metadataId&quot;: 42, # Limits the selected developer metadata to that which has a matching
                  # DeveloperMetadata.metadata_id.
              &quot;visibility&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
                  # DeveloperMetadata.visibility.  If left unspecified, all developer
                  # metadata visibile to the requesting project is considered.
              &quot;metadataValue&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
                  # DeveloperMetadata.metadata_value.
              &quot;locationType&quot;: &quot;A String&quot;, # Limits the selected developer metadata to those entries which are
                  # associated with locations of the specified type.  For example, when this
                  # field is specified as ROW this lookup
                  # only considers developer metadata associated on rows.  If the field is left
                  # unspecified, all location types are considered.  This field cannot be
                  # specified as SPREADSHEET when
                  # the locationMatchingStrategy
                  # is specified as INTERSECTING or when the
                  # metadataLocation is specified as a
                  # non-spreadsheet location: spreadsheet metadata cannot intersect any other
                  # developer metadata location.  This field also must be left unspecified when
                  # the locationMatchingStrategy
                  # is specified as EXACT.
              &quot;locationMatchingStrategy&quot;: &quot;A String&quot;, # Determines how this lookup matches the location.  If this field is
                  # specified as EXACT, only developer metadata associated on the exact
                  # location specified is matched.  If this field is specified to INTERSECTING,
                  # developer metadata associated on intersecting locations is also
                  # matched.  If left unspecified, this field assumes a default value of
                  # INTERSECTING.
                  # If this field is specified, a metadataLocation
                  # must also be specified.
              &quot;metadataKey&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
                  # DeveloperMetadata.metadata_key.
            },
            &quot;a1Range&quot;: &quot;A String&quot;, # Selects data that matches the specified A1 range.
          },
        },
        &quot;clearBasicFilter&quot;: { # Clears the basic filter, if any exists on the sheet. # Clears the basic filter on a sheet.
          &quot;sheetId&quot;: 42, # The sheet ID on which the basic filter should be cleared.
        },
        &quot;autoFill&quot;: { # Fills in more data based on existing data. # Automatically fills in more data based on existing data.
          &quot;useAlternateSeries&quot;: True or False, # True if we should generate data with the &quot;alternate&quot; series.
              # This differs based on the type and amount of source data.
          &quot;range&quot;: { # A range on a sheet. # The range to autofill. This will examine the range and detect
              # the location that has data and automatically fill that data
              # in to the rest of the range.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;sourceAndDestination&quot;: { # A combination of a source range and how to extend that source. # The source and destination areas to autofill.
              # This explicitly lists the source of the autofill and where to
              # extend that data.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension that data should be filled into.
            &quot;source&quot;: { # A range on a sheet. # The location of the data to use as the source of the autofill.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;fillLength&quot;: 42, # The number of rows or columns that data should be filled into.
                # Positive numbers expand beyond the last row or last column
                # of the source.  Negative numbers expand before the first row
                # or first column of the source.
          },
        },
        &quot;sortRange&quot;: { # Sorts data in rows based on a sort order per column. # Sorts data in a range.
          &quot;range&quot;: { # A range on a sheet. # The range to sort.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color, and must be an
                  # RGB-type color. If background_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
              &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color, and must
                  # be an RGB-type color. If foreground_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          ],
        },
        &quot;updateBanding&quot;: { # Updates properties of the supplied banded range. # Updates a banded range
          &quot;bandedRange&quot;: { # A banded (alternating colors) range in a sheet. # The banded range to update with the new properties.
            &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;bandedRangeId&quot;: 42, # The id of the banded range.
            &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          },
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `bandedRange` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
        },
        &quot;appendDimension&quot;: { # Appends rows or columns to the end of a sheet. # Appends dimensions to the end of a sheet.
          &quot;length&quot;: 42, # The number of rows or columns to append.
          &quot;dimension&quot;: &quot;A String&quot;, # Whether rows or columns should be appended.
          &quot;sheetId&quot;: 42, # The sheet to append rows or columns to.
        },
        &quot;addDimensionGroup&quot;: { # Creates a group over the specified range. # Creates a group over the specified range.
            #
            # If the requested range is a superset of the range of an existing group G,
            # then the depth of G is incremented and this new group G&#x27; has the
            # depth of that group. For example, a group [C:D, depth 1] + [B:E] results in
            # groups [B:E, depth 1] and [C:D, depth 2].
            # If the requested range is a subset of the range of an existing group G,
            # then the depth of the new group G&#x27; becomes one greater than the depth of G.
            # For example, a group [B:E, depth 1] + [C:D] results in groups [B:E, depth 1]
            # and [C:D, depth 2].
            # If the requested range starts before and ends within, or starts within and
            # ends after, the range of an existing group G, then the range of the existing
            # group G becomes the union of the ranges, and the new group G&#x27; has
            # depth one greater than the depth of G and range as the intersection of the
            # ranges. For example, a group [B:D, depth 1] + [C:E] results in groups [B:E,
            # depth 1] and [C:D, depth 2].
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which to create a group.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
        &quot;deleteRange&quot;: { # Deletes a range of cells, shifting other cells into the deleted area. # Deletes a range of cells from a sheet, shifting the remaining cells.
          &quot;shiftDimension&quot;: &quot;A String&quot;, # The dimension from which deleted cells will be replaced with.
              # If ROWS, existing cells will be shifted upward to
              # replace the deleted cells. If COLUMNS, existing cells
              # will be shifted left to replace the deleted cells.
          &quot;range&quot;: { # A range on a sheet. # The range of cells to delete.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;pasteData&quot;: { # Inserts data into the spreadsheet starting at the specified coordinate. # Pastes data (HTML or delimited) into a sheet.
          &quot;data&quot;: &quot;A String&quot;, # The data to insert.
          &quot;delimiter&quot;: &quot;A String&quot;, # The delimiter in the data.
          &quot;html&quot;: True or False, # True if the data is HTML.
          &quot;coordinate&quot;: { # A coordinate in a sheet. # The coordinate at which the data should start being inserted.
              # All indexes are zero-based.
            &quot;columnIndex&quot;: 42, # The column index of the coordinate.
            &quot;rowIndex&quot;: 42, # The row index of the coordinate.
            &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
          },
          &quot;type&quot;: &quot;A String&quot;, # How the data should be pasted.
        },
        &quot;duplicateSheet&quot;: { # Duplicates the contents of a sheet. # Duplicates a sheet.
          &quot;newSheetId&quot;: 42, # If set, the ID of the new sheet. If not set, an ID is chosen.
              # If set, the ID must not conflict with any existing sheet ID.
              # If set, it must be non-negative.
          &quot;sourceSheetId&quot;: 42, # The sheet to duplicate.
          &quot;insertSheetIndex&quot;: 42, # The zero-based index where the new sheet should be inserted.
              # The index of all sheets after this are incremented.
          &quot;newSheetName&quot;: &quot;A String&quot;, # The name of the new sheet.  If empty, a new name is chosen for you.
        },
        &quot;moveDimension&quot;: { # Moves one or more rows or columns. # Moves rows or columns to another location in a sheet.
          &quot;destinationIndex&quot;: 42, # The zero-based start index of where to move the source data to,
              # based on the coordinates *before* the source data is removed
              # from the grid.  Existing data will be shifted down or right
              # (depending on the dimension) to make room for the moved dimensions.
              # The source dimensions are removed from the grid, so the
              # the data may end up in a different index than specified.
              #
              # For example, given `A1..A5` of `0, 1, 2, 3, 4` and wanting to move
              # `&quot;1&quot;` and `&quot;2&quot;` to between `&quot;3&quot;` and `&quot;4&quot;`, the source would be
              # `ROWS [1..3)`,and the destination index would be `&quot;4&quot;`
              # (the zero-based index of row 5).
              # The end result would be `A1..A5` of `0, 3, 1, 2, 4`.
          &quot;source&quot;: { # A range along a single dimension on a sheet. # The source dimensions to move.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
        &quot;updateProtectedRange&quot;: { # Updates an existing protected range with the specified # Updates a protected range.
            # protectedRangeId.
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `protectedRange` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;protectedRange&quot;: { # A protected range. # The protected range to update with the new properties.
            &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                # This field is read-only.
            &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
            &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                &quot;A String&quot;,
              ],
              &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                &quot;A String&quot;,
              ],
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
          },
        },
        &quot;createDeveloperMetadata&quot;: { # A request to create developer metadata. # Creates new developer metadata
          &quot;developerMetadata&quot;: { # Developer metadata associated with a location or object in a spreadsheet. # The developer metadata to create.
              # Developer metadata may be used to associate arbitrary data with various
              # parts of a spreadsheet and will remain associated at those locations as they
              # move around and the spreadsheet is edited.  For example, if developer
              # metadata is associated with row 5 and another row is then subsequently
              # inserted above row 5, that original metadata will still be associated with
              # the row it was first associated with (what is now row 6). If the associated
              # object is deleted its metadata is deleted too.
            &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                # same key.  Developer metadata must always have a key specified.
            &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
            &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                # specified.
            &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                # specified when metadata is created, otherwise one will be randomly
                # generated and assigned. Must be positive.
            &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
              &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
              &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
              &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
              &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                  # a dimension. The specified DimensionRange must represent a single row
                  # or column; it cannot be unbounded or span multiple rows or columns.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          },
        },
        &quot;cutPaste&quot;: { # Moves data from the source to the destination. # Cuts data from one area and pastes it to another.
          &quot;pasteType&quot;: &quot;A String&quot;, # What kind of data to paste.  All the source data will be cut, regardless
              # of what is pasted.
          &quot;destination&quot;: { # A coordinate in a sheet. # The top-left coordinate where the data should be pasted.
              # All indexes are zero-based.
            &quot;columnIndex&quot;: 42, # The column index of the coordinate.
            &quot;rowIndex&quot;: 42, # The row index of the coordinate.
            &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
          },
          &quot;source&quot;: { # A range on a sheet. # The source data to cut.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;updateFilterView&quot;: { # Updates properties of the filter view. # Updates the properties of a filter view.
          &quot;filter&quot;: { # A filter view. # The new properties of the filter view.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `filter` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
        },
        &quot;updateDimensionGroup&quot;: { # Updates the state of the specified group. # Updates the state of the specified group.
          &quot;dimensionGroup&quot;: { # A group over an interval of rows or columns on a sheet, which can contain or # The group whose state should be updated. The range and depth of the group
              # should specify a valid group on the sheet, and all other fields updated.
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `dimensionGroup` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
        },
        &quot;deleteFilterView&quot;: { # Deletes a particular filter view. # Deletes a filter view from a sheet.
          &quot;filterId&quot;: 42, # The ID of the filter to delete.
        },
        &quot;addProtectedRange&quot;: { # Adds a new protected range. # Adds a protected range.
          &quot;protectedRange&quot;: { # A protected range. # The protected range to be added. The
              # protectedRangeId field is optional; if
              # one is not set, an id will be randomly generated. (It is an error to
              # specify the ID of a range that already exists.)
            &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                # This field is read-only.
            &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
            &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                &quot;A String&quot;,
              ],
              &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                &quot;A String&quot;,
              ],
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
          },
        },
        &quot;addChart&quot;: { # Adds a chart to a sheet in the spreadsheet. # Adds a chart.
          &quot;chart&quot;: { # A chart embedded in a sheet. # The chart that should be added to the spreadsheet, including the position
              # where it should be placed. The chartId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of an embedded object that already exists.)
            &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
              &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                  # chart&lt;/a&gt;.
                &quot;data&quot;: [ # The Candlestick chart data.
                    # Only one CandlestickData is supported.
                  { # The Candlestick chart data, each containing the low, open, close, and high
                      # values for a series.
                    &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                        # candle. This is the bottom of the candle body.  If less than the close
                        # value the candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                        # candle. This is the top of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                        # This is the top of the candle body.  If greater than the open value the
                        # candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                        # This is the bottom of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                  },
                ],
                &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                    # will be treated as discrete labels, other data will be treated as
                    # continuous values.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              },
              &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                  # A histogram chart groups data items into bins, displaying each bin as a
                  # column of stacked items.  Histograms are used to display the distribution
                  # of a dataset.  Each column of items represents a range into which those
                  # items fall.  The number of bins can be chosen automatically or specified
                  # explicitly.
                &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                    # column.
                &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                    # bucketed or multiple series, each of the same length, containing the name
                    # of the series followed by the values to be bucketed for that series.
                  { # A histogram series containing the series color and data.
                    &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # If bar_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                    # column) is chosen automatically, but it may be overridden here.
                    # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                    # Cannot be negative.
                    # This field is optional.
                &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                    # affect the calculation of bucket sizes.  For example, setting an outlier
                    # percentile of 0.05 indicates that the top and bottom 5% of values when
                    # calculating buckets.  The values are still included in the chart, they will
                    # be added to the first or last buckets instead of their own buckets.
                    # Must be between 0.0 and 0.5.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
                &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                    # on the treemap chart. These levels are not interactive and are shown
                    # without their labels. Defaults to 0 if not specified.
                &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                    # interactive and are shown with their labels. Defaults to 2 if not
                    # specified.
                &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                    # assigned colors based on their color values. These color values come from
                    # color_data, or from size_data if color_data is not specified.
                    # Cells with color values less than or equal to min_value will
                    # have minValueColor as their
                    # background color. Cells with color values greater than or equal to
                    # max_value will have
                    # maxValueColor as their background
                    # color. Cells with color values between min_value and max_value will
                    # have background colors on a gradient between
                    # minValueColor and
                    # maxValueColor, the midpoint of
                    # the gradient being midValueColor.
                    # Cells with missing or non-numeric color values will have
                    # noDataColor as their background
                    # color.
                  &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # If no_data_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # If min_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # If mid_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # If max_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                    # If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual minimum value from color_data, or the minimum value from
                    # size_data if color_data is not specified.
                &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual maximum value from color_data, or the maximum value from
                    # size_data if color_data is not specified.
                &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                    # This field is optional. If not specified, size_data is used to
                    # determine background colors. If specified, the data is expected to be
                    # numeric. color_scale will determine how the values in this data map to
                    # data cell background colors.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                    # expected to be numeric. The cells corresponding to non-numeric or missing
                    # data will not be rendered. If color_data is not specified, this data
                    # is used to determine data cell background colors as well.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                &quot;series&quot;: [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                    &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                        # chartType is AREA,
                        # LINE, or SCATTER.
                        # COMBO charts are also supported if the
                        # series chart type is
                        # AREA or LINE.
                      &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                      &quot;width&quot;: 42, # The thickness of the line, in px.
                    },
                    &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the &quot;Volume&quot; series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn&#x27;t a valid minor axis
                        # for the chart&#x27;s type.
                    &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                    # Applies to Bar and Column charts.
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                    # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
                &quot;domains&quot;: [ # The domain of data this is charting.
                    # Only a single domain is supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  },
                ],
                &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                    # Applies to Line charts.
                &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                    # chart area.
                &quot;axis&quot;: [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                    &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                    &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                    &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                        # values in an axis).
                      &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                          # automatically determine a minimum value that looks good for the data.
                      &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                      &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                          # automatically determine a maximum value that looks good for the data.
                    },
                  },
                ],
                &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
                &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                    # segments of lines in a line chart will be missing).  To eliminate these
                    # gaps set this to true.
                    # Applies to Line, Area, and Combo charts.
              },
              &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
              &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
                &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
                &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
                &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                  &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                  &quot;width&quot;: 42, # The thickness of the line, in px.
                },
                &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                  { # A single series of data for a waterfall chart.
                    &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                        # subtotals are defined is not significant. Only one subtotal may be
                        # defined for each data point.
                      { # A custom subtotal column for a waterfall chart series.
                        &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                            # data_is_subtotal is true, the data point at this index is the
                            # subtotal. Otherwise, the subtotal appears after the data point with
                            # this index. A series can have multiple subtotals at arbitrary indices,
                            # but subtotals do not affect the indices of the data points. For
                            # example, if a series has three data points, their indices will always
                            # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                            # what data points they are associated with.
                        &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                            # the subtotal will be computed and appear after the data point.
                        &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                      },
                    ],
                    &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                        # a subtotal column will appear at the end of each series. Setting this
                        # field to true will hide that subtotal column for this series.
                    &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                  },
                ],
                &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
              },
              &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                  # Org charts require a unique set of labels in labels and may
                  # optionally include parent_labels and tooltips.
                  # parent_labels contain, for each node, the label identifying the parent
                  # node.  tooltips contain, for each node, an optional tooltip.
                  #
                  # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                  # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                  # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                  # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                  # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                    # A blank value indicates that the node has no parent and is a top-level
                    # node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                    # If selected_node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                    # If node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                    # results in no tooltip being displayed for the node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
                &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                    # must be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
                &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
                &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
                &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                  # for accessibility.
              &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                  # axis labels, legend).  If a font is specified for a specific part of the
                  # chart it will override this font name.
              &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                  # minimum padding.  False to use the default padding.
                  # (Not applicable to Geo and Org charts.)
              &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                  # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                  # represent things like total sales, average cost, or a top selling item. You
                  # can specify a single data value, or aggregate over a range of data.
                  # Percentage or absolute difference from a baseline value can be highlighted,
                  # like changes over time.
                &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                    # This field is optional.
                &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                    # This field is optional.
                &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                    # 10 can be used to divide all values in the chart by 10.
                    # This field is optional.
                &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                    # This field is needed only if baseline_value_data is specified.
                  &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                      # This field is optional.
                  &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # If positive_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # If negative_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                },
                &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                    # chart. This field is used only when number_format_source is set to
                    # CUSTOM. This field is optional.
                  &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                      # This field is optional.
                  &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                      # This field is optional.
                },
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
              &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
              &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
                &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                    # 0 is fully transparent and 1 is fully opaque.
                &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                    # the bubbles at different sizes relative to each other.
                    # If specified, group_ids must also be specified.  This field is
                    # optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                    # If specific, the field must be a positive value.
                &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                    # If specified, the field must be a positive value.
                &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                    # If bubble_border_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                    # ID are drawn in the same color. If bubble_sizes is specified then
                    # this field must also be specified but may contain blank values.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                    # in the chart vertically.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
                &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                    # in the chart horizontally.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                    # Underline and Strikethrough are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
              },
            },
            &quot;chartId&quot;: 42, # The ID of the chart.
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        },
        &quot;addSlicer&quot;: { # Adds a slicer to a sheet in the spreadsheet. # Adds a slicer.
          &quot;slicer&quot;: { # A slicer in a sheet. # The slicer that should be added to the spreadsheet, including
              # the position where it should be placed. The slicerId field is optional; if one is not set, an id
              # will be randomly generated. (It is an error to specify the ID
              # of a slicer that already exists.)
            &quot;slicerId&quot;: 42, # The ID of the slicer.
            &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
              &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                  # If not set, default to `True`.
              &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                  # If unspecified, defaults to `LEFT`
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
                # existing sheet. Also, width and height of slicer can be automatically
                # adjusted to keep it within permitted limits.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        },
        &quot;updateBorders&quot;: { # Updates the borders of a range. # Updates the borders in a range of cells.
            # If a field is not set in the request, that means the border remains as-is.
            # For example, with two subsequent UpdateBordersRequest:
            #
            #  1. range: A1:A5 `{ top: RED, bottom: WHITE }`
            #  2. range: A1:A5 `{ left: BLUE }`
            #
            # That would result in A1:A5 having a borders of
            # `{ top: RED, bottom: WHITE, left: BLUE }`.
            # If you want to clear a border, explicitly set the style to
            # NONE.
          &quot;innerHorizontal&quot;: { # A border along a cell. # The horizontal border to put within the range.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;innerVertical&quot;: { # A border along a cell. # The vertical border to put within the range.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;right&quot;: { # A border along a cell. # The border to put at the right of the range.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;bottom&quot;: { # A border along a cell. # The border to put at the bottom of the range.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;left&quot;: { # A border along a cell. # The border to put at the left of the range.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;top&quot;: { # A border along a cell. # The border to put at the top of the range.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;range&quot;: { # A range on a sheet. # The range whose borders should be updated.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;deleteDimension&quot;: { # Deletes the dimensions from the sheet. # Deletes rows or columns in a sheet.
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The dimensions to delete from the sheet.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
        &quot;mergeCells&quot;: { # Merges all cells in the range. # Merges cells together.
          &quot;range&quot;: { # A range on a sheet. # The range of cells to merge.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;mergeType&quot;: &quot;A String&quot;, # How the cells should be merged.
        },
        &quot;updateConditionalFormatRule&quot;: { # Updates a conditional format rule at the given index, # Updates an existing conditional format rule.
            # or moves a conditional format rule to another index.
          &quot;sheetId&quot;: 42, # The sheet of the rule to move.  Required if new_index is set,
              # unused otherwise.
          &quot;newIndex&quot;: 42, # The zero-based new index the rule should end up at.
          &quot;index&quot;: 42, # The zero-based index of the rule that should be replaced or moved.
          &quot;rule&quot;: { # A rule describing a conditional format. # The rule that should replace the rule at the given index.
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        },
        &quot;duplicateFilterView&quot;: { # Duplicates a particular filter view. # Duplicates a filter view.
          &quot;filterId&quot;: 42, # The ID of the filter being duplicated.
        },
        &quot;textToColumns&quot;: { # Splits a column of text into multiple columns, # Converts a column of text into many columns of text.
            # based on a delimiter in each cell.
          &quot;source&quot;: { # A range on a sheet. # The source data range.  This must span exactly one column.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;delimiter&quot;: &quot;A String&quot;, # The delimiter to use. Used only if delimiterType is
              # CUSTOM.
          &quot;delimiterType&quot;: &quot;A String&quot;, # The delimiter type to use.
        },
        &quot;setDataValidation&quot;: { # Sets a data validation rule to every cell in the range. # Sets data validation for one or more cells.
            # To clear validation in a range, call this with no rule specified.
          &quot;range&quot;: { # A range on a sheet. # The range the data validation rule should apply to.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;rule&quot;: { # A data validation rule. # The data validation rule to set on each cell in the range,
              # or empty to clear the data validation in the range.
            &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                # If true, &quot;List&quot; conditions will show a dropdown.
            &quot;strict&quot;: True or False, # True if invalid data should be rejected.
            &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
            &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                # BooleanConditions are used by conditional formatting,
                # data validation, and the criteria in filters.
              &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                  # on the condition type.  Some support zero values,
                  # others one or two values,
                  # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                { # The value of the condition.
                  &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                      # Valid only if the type is
                      # DATE_BEFORE,
                      # DATE_AFTER,
                      # DATE_ON_OR_BEFORE or
                      # DATE_ON_OR_AFTER.
                      #
                      # Relative dates are not supported in data validation.
                      # They are supported only in conditional formatting and
                      # conditional filters.
                  &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                      # The value is parsed as if the user typed into a cell.
                      # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                },
              ],
              &quot;type&quot;: &quot;A String&quot;, # The type of condition.
            },
          },
        },
        &quot;updateDimensionProperties&quot;: { # Updates properties of dimensions within the specified range. # Updates dimensions&#x27; properties.
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `properties` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The rows or columns to update.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
          &quot;properties&quot;: { # Properties about a dimension. # Properties to update.
            &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
            &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                # This field is read-only.
            &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
            &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
              { # Developer metadata associated with a location or object in a spreadsheet.
                  # Developer metadata may be used to associate arbitrary data with various
                  # parts of a spreadsheet and will remain associated at those locations as they
                  # move around and the spreadsheet is edited.  For example, if developer
                  # metadata is associated with row 5 and another row is then subsequently
                  # inserted above row 5, that original metadata will still be associated with
                  # the row it was first associated with (what is now row 6). If the associated
                  # object is deleted its metadata is deleted too.
                &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                    # same key.  Developer metadata must always have a key specified.
                &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                    # specified.
                &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                    # specified when metadata is created, otherwise one will be randomly
                    # generated and assigned. Must be positive.
                &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                  &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                  &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                  &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                  &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                      # a dimension. The specified DimensionRange must represent a single row
                      # or column; it cannot be unbounded or span multiple rows or columns.
                      # All indexes are zero-based.
                      # Indexes are half open: the start index is inclusive
                      # and the end index is exclusive.
                      # Missing indexes indicate the range is unbounded on that side.
                    &quot;sheetId&quot;: 42, # The sheet this span is on.
                    &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                    &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                    &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                  },
                },
              },
            ],
          },
        },
        &quot;addConditionalFormatRule&quot;: { # Adds a new conditional format rule at the given index. # Adds a new conditional format rule.
            # All subsequent rules&#x27; indexes are incremented.
          &quot;index&quot;: 42, # The zero-based index where the rule should be inserted.
          &quot;rule&quot;: { # A rule describing a conditional format. # The rule to add.
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        },
        &quot;copyPaste&quot;: { # Copies data from the source to the destination. # Copies data from one area and pastes it to another.
          &quot;pasteOrientation&quot;: &quot;A String&quot;, # How that data should be oriented when pasting.
          &quot;pasteType&quot;: &quot;A String&quot;, # What kind of data to paste.
          &quot;destination&quot;: { # A range on a sheet. # The location to paste to. If the range covers a span that&#x27;s
              # a multiple of the source&#x27;s height or width, then the
              # data will be repeated to fill in the destination range.
              # If the range is smaller than the source range, the entire
              # source data will still be copied (beyond the end of the destination range).
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;source&quot;: { # A range on a sheet. # The source range to copy.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
        &quot;updateDeveloperMetadata&quot;: { # A request to update properties of developer metadata. # Updates an existing developer metadata entry
            # Updates the properties of the developer metadata selected by the filters to
            # the values provided in the DeveloperMetadata resource.  Callers must
            # specify the properties they wish to update in the fields parameter, as well
            # as specify at least one DataFilter matching the metadata they wish to
            # update.
          &quot;fields&quot;: &quot;A String&quot;, # The fields that should be updated.  At least one field must be specified.
              # The root `developerMetadata` is implied and should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
          &quot;dataFilters&quot;: [ # The filters matching the developer metadata entries to update.
            { # Filter that describes what data should be selected or returned from a
                # request.
              &quot;gridRange&quot;: { # A range on a sheet. # Selects data that matches the range described by the GridRange.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;developerMetadataLookup&quot;: { # Selects DeveloperMetadata that matches all of the specified fields.  For # Selects data associated with the developer metadata matching the criteria
                  # described by this DeveloperMetadataLookup.
                  # example, if only a metadata ID is specified this considers the
                  # DeveloperMetadata with that particular unique ID. If a metadata key is
                  # specified, this considers all developer metadata with that key.  If a
                  # key, visibility, and location type are all specified, this considers all
                  # developer metadata with that key and visibility that are associated with a
                  # location of that type.  In general, this
                  # selects all DeveloperMetadata that matches the intersection of all the
                  # specified fields; any field or combination of fields may be specified.
                &quot;metadataLocation&quot;: { # A location where metadata may be associated in a spreadsheet. # Limits the selected developer metadata to those entries associated with
                    # the specified location.  This field either matches exact locations or all
                    # intersecting locations according the specified
                    # locationMatchingStrategy.
                  &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                  &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                  &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                  &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                      # a dimension. The specified DimensionRange must represent a single row
                      # or column; it cannot be unbounded or span multiple rows or columns.
                      # All indexes are zero-based.
                      # Indexes are half open: the start index is inclusive
                      # and the end index is exclusive.
                      # Missing indexes indicate the range is unbounded on that side.
                    &quot;sheetId&quot;: 42, # The sheet this span is on.
                    &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                    &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                    &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                  },
                },
                &quot;metadataId&quot;: 42, # Limits the selected developer metadata to that which has a matching
                    # DeveloperMetadata.metadata_id.
                &quot;visibility&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
                    # DeveloperMetadata.visibility.  If left unspecified, all developer
                    # metadata visibile to the requesting project is considered.
                &quot;metadataValue&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
                    # DeveloperMetadata.metadata_value.
                &quot;locationType&quot;: &quot;A String&quot;, # Limits the selected developer metadata to those entries which are
                    # associated with locations of the specified type.  For example, when this
                    # field is specified as ROW this lookup
                    # only considers developer metadata associated on rows.  If the field is left
                    # unspecified, all location types are considered.  This field cannot be
                    # specified as SPREADSHEET when
                    # the locationMatchingStrategy
                    # is specified as INTERSECTING or when the
                    # metadataLocation is specified as a
                    # non-spreadsheet location: spreadsheet metadata cannot intersect any other
                    # developer metadata location.  This field also must be left unspecified when
                    # the locationMatchingStrategy
                    # is specified as EXACT.
                &quot;locationMatchingStrategy&quot;: &quot;A String&quot;, # Determines how this lookup matches the location.  If this field is
                    # specified as EXACT, only developer metadata associated on the exact
                    # location specified is matched.  If this field is specified to INTERSECTING,
                    # developer metadata associated on intersecting locations is also
                    # matched.  If left unspecified, this field assumes a default value of
                    # INTERSECTING.
                    # If this field is specified, a metadataLocation
                    # must also be specified.
                &quot;metadataKey&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
                    # DeveloperMetadata.metadata_key.
              },
              &quot;a1Range&quot;: &quot;A String&quot;, # Selects data that matches the specified A1 range.
            },
          ],
          &quot;developerMetadata&quot;: { # Developer metadata associated with a location or object in a spreadsheet. # The value that all metadata matched by the data filters will be updated to.
              # Developer metadata may be used to associate arbitrary data with various
              # parts of a spreadsheet and will remain associated at those locations as they
              # move around and the spreadsheet is edited.  For example, if developer
              # metadata is associated with row 5 and another row is then subsequently
              # inserted above row 5, that original metadata will still be associated with
              # the row it was first associated with (what is now row 6). If the associated
              # object is deleted its metadata is deleted too.
            &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                # same key.  Developer metadata must always have a key specified.
            &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
            &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                # specified.
            &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                # specified when metadata is created, otherwise one will be randomly
                # generated and assigned. Must be positive.
            &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
              &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
              &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
              &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
              &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                  # a dimension. The specified DimensionRange must represent a single row
                  # or column; it cannot be unbounded or span multiple rows or columns.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          },
        },
        &quot;addNamedRange&quot;: { # Adds a named range to the spreadsheet. # Adds a named range.
          &quot;namedRange&quot;: { # A named range. # The named range to add. The namedRangeId
              # field is optional; if one is not set, an id will be randomly generated. (It
              # is an error to specify the ID of a range that already exists.)
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
            &quot;range&quot;: { # A range on a sheet. # The range this represents.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
          },
        },
        &quot;updateEmbeddedObjectPosition&quot;: { # Update an embedded object&#x27;s position (such as a moving or resizing a # Updates an embedded object&#x27;s (e.g. chart, image) position.
            # chart or image).
          &quot;objectId&quot;: 42, # The ID of the object to moved.
          &quot;newPosition&quot;: { # The position of an embedded object such as a chart. # An explicit position to move the embedded object to.
              # If newPosition.sheetId is set,
              # a new sheet with that ID will be created.
              # If newPosition.newSheet is set to true,
              # a new sheet will be created with an ID that will be chosen for you.
            &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
              },
              &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
              &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
            },
            &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
          },
          &quot;fields&quot;: &quot;A String&quot;, # The fields of OverlayPosition
              # that should be updated when setting a new position. Used only if
              # newPosition.overlayPosition
              # is set, in which case at least one field must
              # be specified.  The root `newPosition.overlayPosition` is implied and
              # should not be specified.
              # A single `&quot;*&quot;` can be used as short-hand for listing every field.
        },
        &quot;deleteDimensionGroup&quot;: { # Deletes a group over the specified range by decrementing the depth of the # Deletes a group over the specified range.
            # dimensions in the range.
            #
            # For example, assume the sheet has a depth-1 group over B:E and a depth-2
            # group over C:D. Deleting a group over D:E leaves the sheet with a
            # depth-1 group over B:D and a depth-2 group over C:C.
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The range of the group to be deleted.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
        &quot;randomizeRange&quot;: { # Randomizes the order of the rows in a range. # Randomizes the order of the rows in a range.
          &quot;range&quot;: { # A range on a sheet. # The range to randomize.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
      },
    ],
    &quot;responseRanges&quot;: [ # Limits the ranges included in the response spreadsheet.
        # Meaningful only if include_spreadsheet_in_response is &#x27;true&#x27;.
      &quot;A String&quot;,
    ],
    &quot;responseIncludeGridData&quot;: True or False, # True if grid data should be returned. Meaningful only if
        # include_spreadsheet_in_response is &#x27;true&#x27;.
        # This parameter is ignored if a field mask was set in the request.
    &quot;includeSpreadsheetInResponse&quot;: True or False, # Determines if the update response should include the spreadsheet
        # resource.
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # The reply for batch updating a spreadsheet.
    &quot;replies&quot;: [ # The reply of the updates.  This maps 1:1 with the updates, although
        # replies to some requests may be empty.
      { # A single response from an update.
        &quot;updateEmbeddedObjectPosition&quot;: { # The result of updating an embedded object&#x27;s position. # A reply from updating an embedded object&#x27;s position.
          &quot;position&quot;: { # The position of an embedded object such as a chart. # The new position of the embedded object.
            &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
              },
              &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
              &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
            },
            &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
          },
        },
        &quot;deleteDimensionGroup&quot;: { # The result of deleting a group. # A reply from deleting a dimension group.
          &quot;dimensionGroups&quot;: [ # All groups of a dimension after deleting a group from that dimension.
            { # A group over an interval of rows or columns on a sheet, which can contain or
                # be contained within other groups. A group can be collapsed or expanded as a
                # unit on the sheet.
              &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                  # wholly contains the range of this group.
              &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                  # collapsed if an overlapping group at a shallower depth is expanded.
                  #
                  # A true value does not imply that all dimensions within the group are
                  # hidden, since a dimension&#x27;s visibility can change independently from this
                  # group property. However, when this property is updated, all dimensions
                  # within it are set to hidden if this field is true, or set to visible if
                  # this field is false.
              &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          ],
        },
        &quot;updateConditionalFormatRule&quot;: { # The result of updating a conditional format rule. # A reply from updating a conditional format rule.
          &quot;oldIndex&quot;: 42, # The old index of the rule. Not set if a rule was replaced
              # (because it is the same as new_index).
          &quot;newRule&quot;: { # A rule describing a conditional format. # The new rule that replaced the old rule (if replacing),
              # or the rule that was moved (if moved)
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
          &quot;newIndex&quot;: 42, # The index of the new rule.
          &quot;oldRule&quot;: { # A rule describing a conditional format. # The old (deleted) rule. Not set if a rule was moved
              # (because it is the same as new_rule).
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        },
        &quot;duplicateSheet&quot;: { # The result of duplicating a sheet. # A reply from duplicating a sheet.
          &quot;properties&quot;: { # Properties of a sheet. # The properties of the duplicate sheet.
            &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet is added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in &quot;before the move&quot; indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request is ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
            &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
              &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
              &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
              &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
              &quot;rowCount&quot;: 42, # The number of rows in the grid.
              &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
              &quot;columnCount&quot;: 42, # The number of columns in the grid.
            },
            &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
            &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
                # If tab_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
            &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
          },
        },
        &quot;duplicateFilterView&quot;: { # The result of a filter view being duplicated. # A reply from duplicating a filter view.
          &quot;filter&quot;: { # A filter view. # The newly created filter.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
        },
        &quot;findReplace&quot;: { # The result of the find/replace. # A reply from doing a find/replace.
          &quot;sheetsChanged&quot;: 42, # The number of sheets changed.
          &quot;formulasChanged&quot;: 42, # The number of formula cells changed.
          &quot;occurrencesChanged&quot;: 42, # The number of occurrences (possibly multiple within a cell) changed.
              # For example, if replacing `&quot;e&quot;` with `&quot;o&quot;` in `&quot;Google Sheets&quot;`, this would
              # be `&quot;3&quot;` because `&quot;Google Sheets&quot;` -&gt; `&quot;Googlo Shoots&quot;`.
          &quot;valuesChanged&quot;: 42, # The number of non-formula cells changed.
          &quot;rowsChanged&quot;: 42, # The number of rows changed.
        },
        &quot;createDeveloperMetadata&quot;: { # The response from creating developer metadata. # A reply from creating a developer metadata entry.
          &quot;developerMetadata&quot;: { # Developer metadata associated with a location or object in a spreadsheet. # The developer metadata that was created.
              # Developer metadata may be used to associate arbitrary data with various
              # parts of a spreadsheet and will remain associated at those locations as they
              # move around and the spreadsheet is edited.  For example, if developer
              # metadata is associated with row 5 and another row is then subsequently
              # inserted above row 5, that original metadata will still be associated with
              # the row it was first associated with (what is now row 6). If the associated
              # object is deleted its metadata is deleted too.
            &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                # same key.  Developer metadata must always have a key specified.
            &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
            &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                # specified.
            &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                # specified when metadata is created, otherwise one will be randomly
                # generated and assigned. Must be positive.
            &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
              &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
              &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
              &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
              &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                  # a dimension. The specified DimensionRange must represent a single row
                  # or column; it cannot be unbounded or span multiple rows or columns.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          },
        },
        &quot;addSheet&quot;: { # The result of adding a sheet. # A reply from adding a sheet.
          &quot;properties&quot;: { # Properties of a sheet. # The properties of the newly added sheet.
            &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet is added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in &quot;before the move&quot; indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request is ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
            &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
              &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
              &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
              &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
              &quot;rowCount&quot;: 42, # The number of rows in the grid.
              &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
              &quot;columnCount&quot;: 42, # The number of columns in the grid.
            },
            &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
            &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
                # If tab_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
            &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
          },
        },
        &quot;addBanding&quot;: { # The result of adding a banded range. # A reply from adding a banded range.
          &quot;bandedRange&quot;: { # A banded (alternating colors) range in a sheet. # The banded range that was added.
            &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;bandedRangeId&quot;: 42, # The id of the banded range.
            &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          },
        },
        &quot;trimWhitespace&quot;: { # The result of trimming whitespace in cells. # A reply from trimming whitespace.
          &quot;cellsChangedCount&quot;: 42, # The number of cells that were trimmed of whitespace.
        },
        &quot;deleteConditionalFormatRule&quot;: { # The result of deleting a conditional format rule. # A reply from deleting a conditional format rule.
          &quot;rule&quot;: { # A rule describing a conditional format. # The rule that was deleted.
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        },
        &quot;deleteDeveloperMetadata&quot;: { # The response from deleting developer metadata. # A reply from deleting a developer metadata entry.
          &quot;deletedDeveloperMetadata&quot;: [ # The metadata that was deleted.
            { # Developer metadata associated with a location or object in a spreadsheet.
                # Developer metadata may be used to associate arbitrary data with various
                # parts of a spreadsheet and will remain associated at those locations as they
                # move around and the spreadsheet is edited.  For example, if developer
                # metadata is associated with row 5 and another row is then subsequently
                # inserted above row 5, that original metadata will still be associated with
                # the row it was first associated with (what is now row 6). If the associated
                # object is deleted its metadata is deleted too.
              &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                  # same key.  Developer metadata must always have a key specified.
              &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
              &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                  # specified.
              &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                  # specified when metadata is created, otherwise one will be randomly
                  # generated and assigned. Must be positive.
              &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                    # a dimension. The specified DimensionRange must represent a single row
                    # or column; it cannot be unbounded or span multiple rows or columns.
                    # All indexes are zero-based.
                    # Indexes are half open: the start index is inclusive
                    # and the end index is exclusive.
                    # Missing indexes indicate the range is unbounded on that side.
                  &quot;sheetId&quot;: 42, # The sheet this span is on.
                  &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                  &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                  &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                },
              },
            },
          ],
        },
        &quot;addProtectedRange&quot;: { # The result of adding a new protected range. # A reply from adding a protected range.
          &quot;protectedRange&quot;: { # A protected range. # The newly added protected range.
            &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                # This field is read-only.
            &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
            &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                &quot;A String&quot;,
              ],
              &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                &quot;A String&quot;,
              ],
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
          },
        },
        &quot;updateDeveloperMetadata&quot;: { # The response from updating developer metadata. # A reply from updating a developer metadata entry.
          &quot;developerMetadata&quot;: [ # The updated developer metadata.
            { # Developer metadata associated with a location or object in a spreadsheet.
                # Developer metadata may be used to associate arbitrary data with various
                # parts of a spreadsheet and will remain associated at those locations as they
                # move around and the spreadsheet is edited.  For example, if developer
                # metadata is associated with row 5 and another row is then subsequently
                # inserted above row 5, that original metadata will still be associated with
                # the row it was first associated with (what is now row 6). If the associated
                # object is deleted its metadata is deleted too.
              &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                  # same key.  Developer metadata must always have a key specified.
              &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
              &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                  # specified.
              &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                  # specified when metadata is created, otherwise one will be randomly
                  # generated and assigned. Must be positive.
              &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                    # a dimension. The specified DimensionRange must represent a single row
                    # or column; it cannot be unbounded or span multiple rows or columns.
                    # All indexes are zero-based.
                    # Indexes are half open: the start index is inclusive
                    # and the end index is exclusive.
                    # Missing indexes indicate the range is unbounded on that side.
                  &quot;sheetId&quot;: 42, # The sheet this span is on.
                  &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                  &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                  &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                },
              },
            },
          ],
        },
        &quot;addNamedRange&quot;: { # The result of adding a named range. # A reply from adding a named range.
          &quot;namedRange&quot;: { # A named range. # The named range to add.
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
            &quot;range&quot;: { # A range on a sheet. # The range this represents.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
          },
        },
        &quot;addSlicer&quot;: { # The result of adding a slicer to a spreadsheet. # A reply from adding a slicer.
          &quot;slicer&quot;: { # A slicer in a sheet. # The newly added slicer.
            &quot;slicerId&quot;: 42, # The ID of the slicer.
            &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
              &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                  # If not set, default to `True`.
              &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                  # If unspecified, defaults to `LEFT`
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
                # existing sheet. Also, width and height of slicer can be automatically
                # adjusted to keep it within permitted limits.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        },
        &quot;addDimensionGroup&quot;: { # The result of adding a group. # A reply from adding a dimension group.
          &quot;dimensionGroups&quot;: [ # All groups of a dimension after adding a group to that dimension.
            { # A group over an interval of rows or columns on a sheet, which can contain or
                # be contained within other groups. A group can be collapsed or expanded as a
                # unit on the sheet.
              &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                  # wholly contains the range of this group.
              &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                  # collapsed if an overlapping group at a shallower depth is expanded.
                  #
                  # A true value does not imply that all dimensions within the group are
                  # hidden, since a dimension&#x27;s visibility can change independently from this
                  # group property. However, when this property is updated, all dimensions
                  # within it are set to hidden if this field is true, or set to visible if
                  # this field is false.
              &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          ],
        },
        &quot;addChart&quot;: { # The result of adding a chart to a spreadsheet. # A reply from adding a chart.
          &quot;chart&quot;: { # A chart embedded in a sheet. # The newly added chart.
            &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
              &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                  # chart&lt;/a&gt;.
                &quot;data&quot;: [ # The Candlestick chart data.
                    # Only one CandlestickData is supported.
                  { # The Candlestick chart data, each containing the low, open, close, and high
                      # values for a series.
                    &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                        # candle. This is the bottom of the candle body.  If less than the close
                        # value the candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                        # candle. This is the top of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                        # This is the top of the candle body.  If greater than the open value the
                        # candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                        # This is the bottom of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                  },
                ],
                &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                    # will be treated as discrete labels, other data will be treated as
                    # continuous values.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              },
              &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                  # A histogram chart groups data items into bins, displaying each bin as a
                  # column of stacked items.  Histograms are used to display the distribution
                  # of a dataset.  Each column of items represents a range into which those
                  # items fall.  The number of bins can be chosen automatically or specified
                  # explicitly.
                &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                    # column.
                &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                    # bucketed or multiple series, each of the same length, containing the name
                    # of the series followed by the values to be bucketed for that series.
                  { # A histogram series containing the series color and data.
                    &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # If bar_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                    # column) is chosen automatically, but it may be overridden here.
                    # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                    # Cannot be negative.
                    # This field is optional.
                &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                    # affect the calculation of bucket sizes.  For example, setting an outlier
                    # percentile of 0.05 indicates that the top and bottom 5% of values when
                    # calculating buckets.  The values are still included in the chart, they will
                    # be added to the first or last buckets instead of their own buckets.
                    # Must be between 0.0 and 0.5.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
                &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                    # on the treemap chart. These levels are not interactive and are shown
                    # without their labels. Defaults to 0 if not specified.
                &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                    # interactive and are shown with their labels. Defaults to 2 if not
                    # specified.
                &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                    # assigned colors based on their color values. These color values come from
                    # color_data, or from size_data if color_data is not specified.
                    # Cells with color values less than or equal to min_value will
                    # have minValueColor as their
                    # background color. Cells with color values greater than or equal to
                    # max_value will have
                    # maxValueColor as their background
                    # color. Cells with color values between min_value and max_value will
                    # have background colors on a gradient between
                    # minValueColor and
                    # maxValueColor, the midpoint of
                    # the gradient being midValueColor.
                    # Cells with missing or non-numeric color values will have
                    # noDataColor as their background
                    # color.
                  &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # If no_data_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # If min_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # If mid_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # If max_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                    # If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual minimum value from color_data, or the minimum value from
                    # size_data if color_data is not specified.
                &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual maximum value from color_data, or the maximum value from
                    # size_data if color_data is not specified.
                &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                    # This field is optional. If not specified, size_data is used to
                    # determine background colors. If specified, the data is expected to be
                    # numeric. color_scale will determine how the values in this data map to
                    # data cell background colors.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                    # expected to be numeric. The cells corresponding to non-numeric or missing
                    # data will not be rendered. If color_data is not specified, this data
                    # is used to determine data cell background colors as well.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                &quot;series&quot;: [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                    &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                        # chartType is AREA,
                        # LINE, or SCATTER.
                        # COMBO charts are also supported if the
                        # series chart type is
                        # AREA or LINE.
                      &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                      &quot;width&quot;: 42, # The thickness of the line, in px.
                    },
                    &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the &quot;Volume&quot; series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn&#x27;t a valid minor axis
                        # for the chart&#x27;s type.
                    &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                    # Applies to Bar and Column charts.
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                    # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
                &quot;domains&quot;: [ # The domain of data this is charting.
                    # Only a single domain is supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  },
                ],
                &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                    # Applies to Line charts.
                &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                    # chart area.
                &quot;axis&quot;: [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                    &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                    &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                    &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                        # values in an axis).
                      &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                          # automatically determine a minimum value that looks good for the data.
                      &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                      &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                          # automatically determine a maximum value that looks good for the data.
                    },
                  },
                ],
                &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
                &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                    # segments of lines in a line chart will be missing).  To eliminate these
                    # gaps set this to true.
                    # Applies to Line, Area, and Combo charts.
              },
              &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
              &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
                &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
                &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
                &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                  &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                  &quot;width&quot;: 42, # The thickness of the line, in px.
                },
                &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                  { # A single series of data for a waterfall chart.
                    &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                        # subtotals are defined is not significant. Only one subtotal may be
                        # defined for each data point.
                      { # A custom subtotal column for a waterfall chart series.
                        &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                            # data_is_subtotal is true, the data point at this index is the
                            # subtotal. Otherwise, the subtotal appears after the data point with
                            # this index. A series can have multiple subtotals at arbitrary indices,
                            # but subtotals do not affect the indices of the data points. For
                            # example, if a series has three data points, their indices will always
                            # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                            # what data points they are associated with.
                        &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                            # the subtotal will be computed and appear after the data point.
                        &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                      },
                    ],
                    &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                        # a subtotal column will appear at the end of each series. Setting this
                        # field to true will hide that subtotal column for this series.
                    &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                  },
                ],
                &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
              },
              &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                  # Org charts require a unique set of labels in labels and may
                  # optionally include parent_labels and tooltips.
                  # parent_labels contain, for each node, the label identifying the parent
                  # node.  tooltips contain, for each node, an optional tooltip.
                  #
                  # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                  # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                  # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                  # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                  # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                    # A blank value indicates that the node has no parent and is a top-level
                    # node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                    # If selected_node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                    # If node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                    # results in no tooltip being displayed for the node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
                &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                    # must be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
                &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
                &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
                &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                  # for accessibility.
              &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                  # axis labels, legend).  If a font is specified for a specific part of the
                  # chart it will override this font name.
              &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                  # minimum padding.  False to use the default padding.
                  # (Not applicable to Geo and Org charts.)
              &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                  # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                  # represent things like total sales, average cost, or a top selling item. You
                  # can specify a single data value, or aggregate over a range of data.
                  # Percentage or absolute difference from a baseline value can be highlighted,
                  # like changes over time.
                &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                    # This field is optional.
                &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                    # This field is optional.
                &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                    # 10 can be used to divide all values in the chart by 10.
                    # This field is optional.
                &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                    # This field is needed only if baseline_value_data is specified.
                  &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                      # This field is optional.
                  &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # If positive_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # If negative_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                },
                &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                    # chart. This field is used only when number_format_source is set to
                    # CUSTOM. This field is optional.
                  &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                      # This field is optional.
                  &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                      # This field is optional.
                },
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
              &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
              &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
                &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                    # 0 is fully transparent and 1 is fully opaque.
                &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                    # the bubbles at different sizes relative to each other.
                    # If specified, group_ids must also be specified.  This field is
                    # optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                    # If specific, the field must be a positive value.
                &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                    # If specified, the field must be a positive value.
                &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                    # If bubble_border_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                    # ID are drawn in the same color. If bubble_sizes is specified then
                    # this field must also be specified but may contain blank values.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                    # in the chart vertically.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
                &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                    # in the chart horizontally.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                    # Underline and Strikethrough are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
              },
            },
            &quot;chartId&quot;: 42, # The ID of the chart.
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        },
        &quot;deleteDuplicates&quot;: { # The result of removing duplicates in a range. # A reply from removing rows containing duplicate values.
          &quot;duplicatesRemovedCount&quot;: 42, # The number of duplicate rows removed.
        },
        &quot;addFilterView&quot;: { # The result of adding a filter view. # A reply from adding a filter view.
          &quot;filter&quot;: { # A filter view. # The newly added filter view.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
        },
      },
    ],
    &quot;spreadsheetId&quot;: &quot;A String&quot;, # The spreadsheet the updates were applied to.
    &quot;updatedSpreadsheet&quot;: { # Resource that represents a spreadsheet. # The spreadsheet after updates were applied. This is only set if
        # [BatchUpdateSpreadsheetRequest.include_spreadsheet_in_response] is `true`.
      &quot;spreadsheetUrl&quot;: &quot;A String&quot;, # The url of the spreadsheet.
          # This field is read-only.
      &quot;sheets&quot;: [ # The sheets that are part of a spreadsheet.
        { # A sheet in a spreadsheet.
          &quot;rowGroups&quot;: [ # All row groups on this sheet, ordered by increasing range start index, then
              # by group depth.
            { # A group over an interval of rows or columns on a sheet, which can contain or
                # be contained within other groups. A group can be collapsed or expanded as a
                # unit on the sheet.
              &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                  # wholly contains the range of this group.
              &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                  # collapsed if an overlapping group at a shallower depth is expanded.
                  #
                  # A true value does not imply that all dimensions within the group are
                  # hidden, since a dimension&#x27;s visibility can change independently from this
                  # group property. However, when this property is updated, all dimensions
                  # within it are set to hidden if this field is true, or set to visible if
                  # this field is false.
              &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          ],
          &quot;columnGroups&quot;: [ # All column groups on this sheet, ordered by increasing range start index,
              # then by group depth.
            { # A group over an interval of rows or columns on a sheet, which can contain or
                # be contained within other groups. A group can be collapsed or expanded as a
                # unit on the sheet.
              &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                  # wholly contains the range of this group.
              &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                  # collapsed if an overlapping group at a shallower depth is expanded.
                  #
                  # A true value does not imply that all dimensions within the group are
                  # hidden, since a dimension&#x27;s visibility can change independently from this
                  # group property. However, when this property is updated, all dimensions
                  # within it are set to hidden if this field is true, or set to visible if
                  # this field is false.
              &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          ],
          &quot;slicers&quot;: [ # The slicers on this sheet.
            { # A slicer in a sheet.
              &quot;slicerId&quot;: 42, # The ID of the slicer.
              &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
                &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
                  &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                      # shown. Mutually exclusive with visible_foreground_color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                      # (This does not override hidden_values -- if a value is listed there,
                      #  it will still be hidden.)
                      # BooleanConditions are used by conditional formatting,
                      # data validation, and the criteria in filters.
                    &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                        # on the condition type.  Some support zero values,
                        # others one or two values,
                        # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                      { # The value of the condition.
                        &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                            # Valid only if the type is
                            # DATE_BEFORE,
                            # DATE_AFTER,
                            # DATE_ON_OR_BEFORE or
                            # DATE_ON_OR_AFTER.
                            #
                            # Relative dates are not supported in data validation.
                            # They are supported only in conditional formatting and
                            # conditional filters.
                        &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                            # The value is parsed as if the user typed into a cell.
                            # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                      },
                    ],
                    &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                  },
                  &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                      # are shown. Mutually exclusive with visible_background_color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                      # shown. This field is mutually exclusive with visible_foreground_color,
                      # and must be set to an RGB-type color. If visible_background_color is
                      # also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                      # are shown. This field is mutually exclusive with
                      # visible_background_color, and must be set to an RGB-type color. If
                      # visible_foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;hiddenValues&quot;: [ # Values that should be hidden.
                    &quot;A String&quot;,
                  ],
                },
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                    # If not set, default to `True`.
                &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                    # All indexes are zero-based.
                    # Indexes are half open, e.g the start index is inclusive
                    # and the end index is exclusive -- [start_index, end_index).
                    # Missing indexes indicate the range is unbounded on that side.
                    #
                    # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                    #
                    #   `Sheet1!A1:A1 == sheet_id: 0,
                    #                   start_row_index: 0, end_row_index: 1,
                    #                   start_column_index: 0, end_column_index: 1`
                    #
                    #   `Sheet1!A3:B4 == sheet_id: 0,
                    #                   start_row_index: 2, end_row_index: 4,
                    #                   start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A:B == sheet_id: 0,
                    #                 start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A5:B == sheet_id: 0,
                    #                  start_row_index: 4,
                    #                  start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1 == sheet_id:0`
                    #
                    # The start index must always be less than or equal to the end index.
                    # If the start index equals the end index, then the range is empty.
                    # Empty ranges are typically not meaningful and are usually rendered in the
                    # UI as `#REF!`.
                  &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                  &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                  &quot;sheetId&quot;: 42, # The sheet this range is on.
                  &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                  &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                },
                &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                    # If unspecified, defaults to `LEFT`
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
                  # existing sheet. Also, width and height of slicer can be automatically
                  # adjusted to keep it within permitted limits.
                &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                  &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                      # All indexes are zero-based.
                    &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                    &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                    &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                  },
                  &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                  &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                      # from the anchor cell.
                  &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                      # from the anchor cell.
                  &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
                },
                &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                    # is chosen for you. Used only when writing.
                &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                    # is on its own sheet. Must be non-negative.
              },
            },
          ],
          &quot;developerMetadata&quot;: [ # The developer metadata associated with a sheet.
            { # Developer metadata associated with a location or object in a spreadsheet.
                # Developer metadata may be used to associate arbitrary data with various
                # parts of a spreadsheet and will remain associated at those locations as they
                # move around and the spreadsheet is edited.  For example, if developer
                # metadata is associated with row 5 and another row is then subsequently
                # inserted above row 5, that original metadata will still be associated with
                # the row it was first associated with (what is now row 6). If the associated
                # object is deleted its metadata is deleted too.
              &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                  # same key.  Developer metadata must always have a key specified.
              &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
              &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                  # specified.
              &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                  # specified when metadata is created, otherwise one will be randomly
                  # generated and assigned. Must be positive.
              &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                    # a dimension. The specified DimensionRange must represent a single row
                    # or column; it cannot be unbounded or span multiple rows or columns.
                    # All indexes are zero-based.
                    # Indexes are half open: the start index is inclusive
                    # and the end index is exclusive.
                    # Missing indexes indicate the range is unbounded on that side.
                  &quot;sheetId&quot;: 42, # The sheet this span is on.
                  &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                  &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                  &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                },
              },
            },
          ],
          &quot;filterViews&quot;: [ # The filter views in this sheet.
            { # A filter view.
              &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                  # The map&#x27;s key is the column index, and the value is the criteria for
                  # that column.
                &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                  &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                      # shown. Mutually exclusive with visible_foreground_color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                      # (This does not override hidden_values -- if a value is listed there,
                      #  it will still be hidden.)
                      # BooleanConditions are used by conditional formatting,
                      # data validation, and the criteria in filters.
                    &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                        # on the condition type.  Some support zero values,
                        # others one or two values,
                        # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                      { # The value of the condition.
                        &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                            # Valid only if the type is
                            # DATE_BEFORE,
                            # DATE_AFTER,
                            # DATE_ON_OR_BEFORE or
                            # DATE_ON_OR_AFTER.
                            #
                            # Relative dates are not supported in data validation.
                            # They are supported only in conditional formatting and
                            # conditional filters.
                        &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                            # The value is parsed as if the user typed into a cell.
                            # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                      },
                    ],
                    &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                  },
                  &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                      # are shown. Mutually exclusive with visible_background_color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                      # shown. This field is mutually exclusive with visible_foreground_color,
                      # and must be set to an RGB-type color. If visible_background_color is
                      # also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                      # are shown. This field is mutually exclusive with
                      # visible_background_color, and must be set to an RGB-type color. If
                      # visible_foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;hiddenValues&quot;: [ # Values that should be hidden.
                    &quot;A String&quot;,
                  ],
                },
              },
              &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
              &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                  # are equal in the earlier specifications.
                { # A sort order associated with a specific column or row.
                  &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                      # to the top. Mutually exclusive with foreground_color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                      # to the top. Mutually exclusive with foreground_color, and must be an
                      # RGB-type color. If background_color is also set, this field takes
                      # precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                  &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                      # sorted to the top. Mutually exclusive with background_color, and must
                      # be an RGB-type color. If foreground_color is also set, this field takes
                      # precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                      # sorted to the top. Mutually exclusive with background_color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              ],
              &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
              &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;filterViewId&quot;: 42, # The ID of the filter view.
            },
          ],
          &quot;charts&quot;: [ # The specifications of every chart on this sheet.
            { # A chart embedded in a sheet.
              &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
                &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                    # chart&lt;/a&gt;.
                  &quot;data&quot;: [ # The Candlestick chart data.
                      # Only one CandlestickData is supported.
                    { # The Candlestick chart data, each containing the low, open, close, and high
                        # values for a series.
                      &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                          # candle. This is the bottom of the candle body.  If less than the close
                          # value the candle will be filled.  Otherwise the candle will be hollow.
                        &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                          &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                            &quot;sources&quot;: [ # The ranges of data for a series or domain.
                                # Exactly one dimension must have a length of 1,
                                # and all sources in the list must have the same dimension
                                # with length 1.
                                # The domain (if it exists) &amp; all series must have the same number
                                # of source ranges. If using more than one source range, then the source
                                # range at a given offset must be in order and contiguous across the domain
                                # and series.
                                #
                                # For example, these are valid configurations:
                                #
                                #     domain sources: A1:A5
                                #     series1 sources: B1:B5
                                #     series2 sources: D6:D10
                                #
                                #     domain sources: A1:A5, C10:C12
                                #     series1 sources: B1:B5, D10:D12
                                #     series2 sources: C1:C5, E10:E12
                              { # A range on a sheet.
                                  # All indexes are zero-based.
                                  # Indexes are half open, e.g the start index is inclusive
                                  # and the end index is exclusive -- [start_index, end_index).
                                  # Missing indexes indicate the range is unbounded on that side.
                                  #
                                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                  #
                                  #   `Sheet1!A1:A1 == sheet_id: 0,
                                  #                   start_row_index: 0, end_row_index: 1,
                                  #                   start_column_index: 0, end_column_index: 1`
                                  #
                                  #   `Sheet1!A3:B4 == sheet_id: 0,
                                  #                   start_row_index: 2, end_row_index: 4,
                                  #                   start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A:B == sheet_id: 0,
                                  #                 start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A5:B == sheet_id: 0,
                                  #                  start_row_index: 4,
                                  #                  start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1 == sheet_id:0`
                                  #
                                  # The start index must always be less than or equal to the end index.
                                  # If the start index equals the end index, then the range is empty.
                                  # Empty ranges are typically not meaningful and are usually rendered in the
                                  # UI as `#REF!`.
                                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                                &quot;sheetId&quot;: 42, # The sheet this range is on.
                                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                              },
                            ],
                          },
                        },
                      },
                      &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                          # candle. This is the top of the candle&#x27;s center line.
                        &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                          &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                            &quot;sources&quot;: [ # The ranges of data for a series or domain.
                                # Exactly one dimension must have a length of 1,
                                # and all sources in the list must have the same dimension
                                # with length 1.
                                # The domain (if it exists) &amp; all series must have the same number
                                # of source ranges. If using more than one source range, then the source
                                # range at a given offset must be in order and contiguous across the domain
                                # and series.
                                #
                                # For example, these are valid configurations:
                                #
                                #     domain sources: A1:A5
                                #     series1 sources: B1:B5
                                #     series2 sources: D6:D10
                                #
                                #     domain sources: A1:A5, C10:C12
                                #     series1 sources: B1:B5, D10:D12
                                #     series2 sources: C1:C5, E10:E12
                              { # A range on a sheet.
                                  # All indexes are zero-based.
                                  # Indexes are half open, e.g the start index is inclusive
                                  # and the end index is exclusive -- [start_index, end_index).
                                  # Missing indexes indicate the range is unbounded on that side.
                                  #
                                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                  #
                                  #   `Sheet1!A1:A1 == sheet_id: 0,
                                  #                   start_row_index: 0, end_row_index: 1,
                                  #                   start_column_index: 0, end_column_index: 1`
                                  #
                                  #   `Sheet1!A3:B4 == sheet_id: 0,
                                  #                   start_row_index: 2, end_row_index: 4,
                                  #                   start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A:B == sheet_id: 0,
                                  #                 start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A5:B == sheet_id: 0,
                                  #                  start_row_index: 4,
                                  #                  start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1 == sheet_id:0`
                                  #
                                  # The start index must always be less than or equal to the end index.
                                  # If the start index equals the end index, then the range is empty.
                                  # Empty ranges are typically not meaningful and are usually rendered in the
                                  # UI as `#REF!`.
                                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                                &quot;sheetId&quot;: 42, # The sheet this range is on.
                                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                              },
                            ],
                          },
                        },
                      },
                      &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                          # This is the top of the candle body.  If greater than the open value the
                          # candle will be filled.  Otherwise the candle will be hollow.
                        &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                          &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                            &quot;sources&quot;: [ # The ranges of data for a series or domain.
                                # Exactly one dimension must have a length of 1,
                                # and all sources in the list must have the same dimension
                                # with length 1.
                                # The domain (if it exists) &amp; all series must have the same number
                                # of source ranges. If using more than one source range, then the source
                                # range at a given offset must be in order and contiguous across the domain
                                # and series.
                                #
                                # For example, these are valid configurations:
                                #
                                #     domain sources: A1:A5
                                #     series1 sources: B1:B5
                                #     series2 sources: D6:D10
                                #
                                #     domain sources: A1:A5, C10:C12
                                #     series1 sources: B1:B5, D10:D12
                                #     series2 sources: C1:C5, E10:E12
                              { # A range on a sheet.
                                  # All indexes are zero-based.
                                  # Indexes are half open, e.g the start index is inclusive
                                  # and the end index is exclusive -- [start_index, end_index).
                                  # Missing indexes indicate the range is unbounded on that side.
                                  #
                                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                  #
                                  #   `Sheet1!A1:A1 == sheet_id: 0,
                                  #                   start_row_index: 0, end_row_index: 1,
                                  #                   start_column_index: 0, end_column_index: 1`
                                  #
                                  #   `Sheet1!A3:B4 == sheet_id: 0,
                                  #                   start_row_index: 2, end_row_index: 4,
                                  #                   start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A:B == sheet_id: 0,
                                  #                 start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A5:B == sheet_id: 0,
                                  #                  start_row_index: 4,
                                  #                  start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1 == sheet_id:0`
                                  #
                                  # The start index must always be less than or equal to the end index.
                                  # If the start index equals the end index, then the range is empty.
                                  # Empty ranges are typically not meaningful and are usually rendered in the
                                  # UI as `#REF!`.
                                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                                &quot;sheetId&quot;: 42, # The sheet this range is on.
                                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                              },
                            ],
                          },
                        },
                      },
                      &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                          # This is the bottom of the candle&#x27;s center line.
                        &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                          &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                            &quot;sources&quot;: [ # The ranges of data for a series or domain.
                                # Exactly one dimension must have a length of 1,
                                # and all sources in the list must have the same dimension
                                # with length 1.
                                # The domain (if it exists) &amp; all series must have the same number
                                # of source ranges. If using more than one source range, then the source
                                # range at a given offset must be in order and contiguous across the domain
                                # and series.
                                #
                                # For example, these are valid configurations:
                                #
                                #     domain sources: A1:A5
                                #     series1 sources: B1:B5
                                #     series2 sources: D6:D10
                                #
                                #     domain sources: A1:A5, C10:C12
                                #     series1 sources: B1:B5, D10:D12
                                #     series2 sources: C1:C5, E10:E12
                              { # A range on a sheet.
                                  # All indexes are zero-based.
                                  # Indexes are half open, e.g the start index is inclusive
                                  # and the end index is exclusive -- [start_index, end_index).
                                  # Missing indexes indicate the range is unbounded on that side.
                                  #
                                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                  #
                                  #   `Sheet1!A1:A1 == sheet_id: 0,
                                  #                   start_row_index: 0, end_row_index: 1,
                                  #                   start_column_index: 0, end_column_index: 1`
                                  #
                                  #   `Sheet1!A3:B4 == sheet_id: 0,
                                  #                   start_row_index: 2, end_row_index: 4,
                                  #                   start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A:B == sheet_id: 0,
                                  #                 start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1!A5:B == sheet_id: 0,
                                  #                  start_row_index: 4,
                                  #                  start_column_index: 0, end_column_index: 2`
                                  #
                                  #   `Sheet1 == sheet_id:0`
                                  #
                                  # The start index must always be less than or equal to the end index.
                                  # If the start index equals the end index, then the range is empty.
                                  # Empty ranges are typically not meaningful and are usually rendered in the
                                  # UI as `#REF!`.
                                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                                &quot;sheetId&quot;: 42, # The sheet this range is on.
                                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                              },
                            ],
                          },
                        },
                      },
                    },
                  ],
                  &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                      # will be treated as discrete labels, other data will be treated as
                      # continuous values.
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                },
                &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                    # A histogram chart groups data items into bins, displaying each bin as a
                    # column of stacked items.  Histograms are used to display the distribution
                    # of a dataset.  Each column of items represents a range into which those
                    # items fall.  The number of bins can be chosen automatically or specified
                    # explicitly.
                  &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                      # column.
                  &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                      # bucketed or multiple series, each of the same length, containing the name
                      # of the series followed by the values to be bucketed for that series.
                    { # A histogram series containing the series color and data.
                      &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                          # This field is optional.
                          # If bar_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                      &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                          # This field is optional.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                  ],
                  &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                  &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                      # column) is chosen automatically, but it may be overridden here.
                      # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                      # Cannot be negative.
                      # This field is optional.
                  &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                      # affect the calculation of bucket sizes.  For example, setting an outlier
                      # percentile of 0.05 indicates that the top and bottom 5% of values when
                      # calculating buckets.  The values are still included in the chart, they will
                      # be added to the first or last buckets instead of their own buckets.
                      # Must be between 0.0 and 0.5.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                    # Not applicable to Org charts.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
                  &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                      # on the treemap chart. These levels are not interactive and are shown
                      # without their labels. Defaults to 0 if not specified.
                  &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                      # interactive and are shown with their labels. Defaults to 2 if not
                      # specified.
                  &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                      # assigned colors based on their color values. These color values come from
                      # color_data, or from size_data if color_data is not specified.
                      # Cells with color values less than or equal to min_value will
                      # have minValueColor as their
                      # background color. Cells with color values greater than or equal to
                      # max_value will have
                      # maxValueColor as their background
                      # color. Cells with color values between min_value and max_value will
                      # have background colors on a gradient between
                      # minValueColor and
                      # maxValueColor, the midpoint of
                      # the gradient being midValueColor.
                      # Cells with missing or non-numeric color values will have
                      # noDataColor as their background
                      # color.
                    &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                        # them. Defaults to #000000 if not specified.
                        # If no_data_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                        # minValue. Defaults to #dc3912 if not
                        # specified.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                        # minValue. Defaults to #dc3912 if not
                        # specified.
                        # If min_value_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                        # minValue and
                        # maxValue. Defaults to #efe6dc if not
                        # specified.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                        # them. Defaults to #000000 if not specified.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                        # to maxValue. Defaults to #109618 if not
                        # specified.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                        # minValue and
                        # maxValue. Defaults to #efe6dc if not
                        # specified.
                        # If mid_value_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                        # to maxValue. Defaults to #109618 if not
                        # specified.
                        # If max_value_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                  },
                  &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                      # If header_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                      # have the same color as cells with this value. If not specified, defaults
                      # to the actual minimum value from color_data, or the minimum value from
                      # size_data if color_data is not specified.
                  &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                      # have the same color as cells with this value. If not specified, defaults
                      # to the actual maximum value from color_data, or the maximum value from
                      # size_data if color_data is not specified.
                  &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                      # This field is optional. If not specified, size_data is used to
                      # determine background colors. If specified, the data is expected to be
                      # numeric. color_scale will determine how the values in this data map to
                      # data cell background colors.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                      # expected to be numeric. The cells corresponding to non-numeric or missing
                      # data will not be rendered. If color_data is not specified, this data
                      # is used to determine data cell background colors as well.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                    # See BasicChartType for the list of all
                    # charts this supports.
                    # of charts this supports.
                  &quot;series&quot;: [ # The data this chart is visualizing.
                    { # A single series of data in a chart.
                        # For example, if charting stock prices over time, multiple series may exist,
                        # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                      &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                      &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                          # chartType is AREA,
                          # LINE, or SCATTER.
                          # COMBO charts are also supported if the
                          # series chart type is
                          # AREA or LINE.
                        &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                        &quot;width&quot;: 42, # The thickness of the line, in px.
                      },
                      &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                          # this series.  If empty, a default color is used.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                          # For example, if charting stocks over time, the &quot;Volume&quot; series
                          # may want to be pinned to the right with the prices pinned to the left,
                          # because the scale of trading volume is different than the scale of
                          # prices.
                          # It is an error to specify an axis that isn&#x27;t a valid minor axis
                          # for the chart&#x27;s type.
                      &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                          # chartType is
                          # COMBO.
                          # Different types will change the way the series is visualized.
                          # Only LINE, AREA,
                          # and COLUMN are supported.
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                          # this series.  If empty, a default color is used.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                  ],
                  &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                  &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                      # Applies to Bar and Column charts.
                  &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                      # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
                  &quot;domains&quot;: [ # The domain of data this is charting.
                      # Only a single domain is supported.
                    { # The domain of a chart.
                        # For example, if charting stock prices over time, this would be the date.
                      &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                          # this is the data representing the dates.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                      &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                    },
                  ],
                  &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                      # Applies to Line charts.
                  &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                      # If not set, Google Sheets will guess how many rows are headers based
                      # on the data.
                      #
                      # (Note that BasicChartAxis.title may override the axis title
                      #  inferred from the header values.)
                  &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                      # chart area.
                  &quot;axis&quot;: [ # The axis on the chart.
                    { # An axis of the chart.
                        # A chart may not have more than one axis per
                        # axis position.
                      &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                          # from headers of the data.
                      &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                      &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                          # Only valid if the axis is not associated with the domain.
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                        &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                      },
                      &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                          # values in an axis).
                        &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                            # automatically determine a minimum value that looks good for the data.
                        &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                        &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                            # automatically determine a maximum value that looks good for the data.
                      },
                    },
                  ],
                  &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
                  &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                      # segments of lines in a line chart will be missing).  To eliminate these
                      # gaps set this to true.
                      # Applies to Line, Area, and Combo charts.
                },
                &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
                &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
                  &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
                  &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
                  &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                    &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                    &quot;width&quot;: 42, # The thickness of the line, in px.
                  },
                  &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                    { # A single series of data for a waterfall chart.
                      &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                          # subtotals are defined is not significant. Only one subtotal may be
                          # defined for each data point.
                        { # A custom subtotal column for a waterfall chart series.
                          &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                              # data_is_subtotal is true, the data point at this index is the
                              # subtotal. Otherwise, the subtotal appears after the data point with
                              # this index. A series can have multiple subtotals at arbitrary indices,
                              # but subtotals do not affect the indices of the data points. For
                              # example, if a series has three data points, their indices will always
                              # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                              # what data points they are associated with.
                          &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                              # the subtotal will be computed and appear after the data point.
                          &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                        },
                      ],
                      &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                          # a subtotal column will appear at the end of each series. Setting this
                          # field to true will hide that subtotal column for this series.
                      &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                      &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                        &quot;colorStyle&quot;: { # A color value. # The color of the column.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                      },
                      &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                        &quot;colorStyle&quot;: { # A color value. # The color of the column.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                      },
                      &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                        &quot;colorStyle&quot;: { # A color value. # The color of the column.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                      },
                    },
                  ],
                  &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
                },
                &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                    # Strikethrough and underline are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                    # Org charts require a unique set of labels in labels and may
                    # optionally include parent_labels and tooltips.
                    # parent_labels contain, for each node, the label identifying the parent
                    # node.  tooltips contain, for each node, an optional tooltip.
                    #
                    # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                    # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                    # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                    # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                    # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
                  &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                      # A blank value indicates that the node has no parent and is a top-level
                      # node.
                      # This field is optional.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                      # If selected_node_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                      # If node_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                      # results in no tooltip being displayed for the node.
                      # This field is optional.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
                  &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                      # must be unique.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
                  &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
                  &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
                  &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
                  &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                    # for accessibility.
                &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                    # This field is optional.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                },
                &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                    # axis labels, legend).  If a font is specified for a specific part of the
                    # chart it will override this font name.
                &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                    # Strikethrough and underline are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                    # minimum padding.  False to use the default padding.
                    # (Not applicable to Geo and Org charts.)
                &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                    # This field is optional.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                },
                &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                    # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                    # represent things like total sales, average cost, or a top selling item. You
                    # can specify a single data value, or aggregate over a range of data.
                    # Percentage or absolute difference from a baseline value can be highlighted,
                    # like changes over time.
                  &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                      # This field is optional.
                  &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                      # This field is optional.
                  &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                      # 10 can be used to divide all values in the chart by 10.
                      # This field is optional.
                  &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                      # This field is optional.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                      # This field is needed only if baseline_value_data is specified.
                    &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                        # This field is optional.
                    &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                        # key value. This field is optional.
                        # If positive_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                        # key value. This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                        # key value. This field is optional.
                        # If negative_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                        # This field is optional. If not specified, default positioning is used.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                    &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                        # key value. This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                        # This field is optional. If not specified, default positioning is used.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                  },
                  &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                      # chart. This field is used only when number_format_source is set to
                      # CUSTOM. This field is optional.
                    &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                        # This field is optional.
                    &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                        # This field is optional.
                  },
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                    # Not applicable to Org charts.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
                &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
                &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
                  &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                      # 0 is fully transparent and 1 is fully opaque.
                  &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                      # the bubbles at different sizes relative to each other.
                      # If specified, group_ids must also be specified.  This field is
                      # optional.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                      # If specific, the field must be a positive value.
                  &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                      # If specified, the field must be a positive value.
                  &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                      # If bubble_border_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                      # ID are drawn in the same color. If bubble_sizes is specified then
                      # this field must also be specified but may contain blank values.
                      # This field is optional.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                      # in the chart vertically.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
                  &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                      # in the chart horizontally.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                      # Underline and Strikethrough are not supported.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                },
              },
              &quot;chartId&quot;: 42, # The ID of the chart.
              &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
                &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                  &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                      # All indexes are zero-based.
                    &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                    &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                    &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                  },
                  &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                  &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                      # from the anchor cell.
                  &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                      # from the anchor cell.
                  &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
                },
                &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                    # is chosen for you. Used only when writing.
                &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                    # is on its own sheet. Must be non-negative.
              },
            },
          ],
          &quot;protectedRanges&quot;: [ # The protected ranges in this sheet.
            { # A protected range.
              &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                  # Unprotected ranges are only supported on protected sheets.
                { # A range on a sheet.
                    # All indexes are zero-based.
                    # Indexes are half open, e.g the start index is inclusive
                    # and the end index is exclusive -- [start_index, end_index).
                    # Missing indexes indicate the range is unbounded on that side.
                    #
                    # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                    #
                    #   `Sheet1!A1:A1 == sheet_id: 0,
                    #                   start_row_index: 0, end_row_index: 1,
                    #                   start_column_index: 0, end_column_index: 1`
                    #
                    #   `Sheet1!A3:B4 == sheet_id: 0,
                    #                   start_row_index: 2, end_row_index: 4,
                    #                   start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A:B == sheet_id: 0,
                    #                 start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A5:B == sheet_id: 0,
                    #                  start_row_index: 4,
                    #                  start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1 == sheet_id:0`
                    #
                    # The start index must always be less than or equal to the end index.
                    # If the start index equals the end index, then the range is empty.
                    # Empty ranges are typically not meaningful and are usually rendered in the
                    # UI as `#REF!`.
                  &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                  &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                  &quot;sheetId&quot;: 42, # The sheet this range is on.
                  &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                  &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                },
              ],
              &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                  # protected area.
                  # This field is read-only.
              &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                  # This field is read-only.
              &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
              &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                  # The range may be fully unbounded, in which case this is considered
                  # a protected sheet.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                  # Warning-based protection means that every user can edit data in the
                  # protected range, except editing will prompt a warning asking the user
                  # to confirm the edit.
                  #
                  # When writing: if this field is true, then editors is ignored.
                  # Additionally, if this field is changed from true to false and the
                  # `editors` field is not set (nor included in the field mask), then
                  # the editors will be set to all the editors in the document.
              &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                  # This field is only visible to users with edit access to the protected
                  # range and the document.
                  # Editors are not supported with warning_only protection.
                &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                  &quot;A String&quot;,
                ],
                &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                    # range.  Domain protection is only supported on documents within a domain.
                &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                  &quot;A String&quot;,
                ],
              },
              &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                  #
                  # When writing, only one of range or named_range_id
                  # may be set.
            },
          ],
          &quot;basicFilter&quot;: { # The default filter associated with a sheet. # The filter on this sheet, if any.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range the filter covers.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
          },
          &quot;merges&quot;: [ # The ranges that are merged together.
            { # A range on a sheet.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          ],
          &quot;bandedRanges&quot;: [ # The banded (alternating colors) ranges on this sheet.
            { # A banded (alternating colors) range in a sheet.
              &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                  # by-column basis throughout all the columns in the range. At least one of
                  # row_properties or column_properties must be specified.
                  # BandedRange.row_properties and BandedRange.column_properties are
                  # set, the fill colors are applied to cells according to the following rules:
                  #
                  # * header_color and footer_color take priority over band colors.
                  # * first_band_color takes priority over second_band_color.
                  # * row_properties takes priority over column_properties.
                  #
                  # For example, the first row color takes priority over the first column
                  # color, but the first column color takes priority over the second row color.
                  # Similarly, the row header takes priority over the column header in the
                  # top left cell, but the column header takes priority over the first row
                  # color if the row header is not set.
                &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                    # If first_band_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                    # or column is filled with this color and the colors alternate between
                    # first_band_color and second_band_color starting from the second
                    # row or column. Otherwise, the first row or column is filled with
                    # first_band_color and the colors proceed to alternate as they normally
                    # would.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                    # or column is filled with this color and the colors alternate between
                    # first_band_color and second_band_color starting from the second
                    # row or column. Otherwise, the first row or column is filled with
                    # first_band_color and the colors proceed to alternate as they normally
                    # would. If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                    # If second_band_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                    # row or column is filled with either first_band_color or
                    # second_band_color, depending on the color of the previous row or
                    # column.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                    # row or column is filled with either first_band_color or
                    # second_band_color, depending on the color of the previous row or
                    # column.
                    # If footer_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              },
              &quot;bandedRangeId&quot;: 42, # The id of the banded range.
              &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                  # basis throughout all the rows in the range. At least one of
                  # row_properties or column_properties must be specified.
                  # BandedRange.row_properties and BandedRange.column_properties are
                  # set, the fill colors are applied to cells according to the following rules:
                  #
                  # * header_color and footer_color take priority over band colors.
                  # * first_band_color takes priority over second_band_color.
                  # * row_properties takes priority over column_properties.
                  #
                  # For example, the first row color takes priority over the first column
                  # color, but the first column color takes priority over the second row color.
                  # Similarly, the row header takes priority over the column header in the
                  # top left cell, but the column header takes priority over the first row
                  # color if the row header is not set.
                &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                    # If first_band_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                    # or column is filled with this color and the colors alternate between
                    # first_band_color and second_band_color starting from the second
                    # row or column. Otherwise, the first row or column is filled with
                    # first_band_color and the colors proceed to alternate as they normally
                    # would.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                    # or column is filled with this color and the colors alternate between
                    # first_band_color and second_band_color starting from the second
                    # row or column. Otherwise, the first row or column is filled with
                    # first_band_color and the colors proceed to alternate as they normally
                    # would. If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                    # If second_band_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                    # row or column is filled with either first_band_color or
                    # second_band_color, depending on the color of the previous row or
                    # column.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                    # row or column is filled with either first_band_color or
                    # second_band_color, depending on the color of the previous row or
                    # column.
                    # If footer_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              },
              &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            },
          ],
          &quot;properties&quot;: { # Properties of a sheet. # The properties of the sheet.
            &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
                # When adding or updating sheet properties, if this field
                # is excluded then the sheet is added or moved to the end
                # of the sheet list. When updating sheet indices or inserting
                # sheets, movement is considered in &quot;before the move&quot; indexes.
                # For example, if there were 3 sheets (S1, S2, S3) in order to
                # move S1 ahead of S2 the index would have to be set to 2. A sheet
                # index update request is ignored if the requested index is
                # identical to the sheets current index or if the requested new
                # index is equal to the current sheet index + 1.
            &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
            &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
                # (If the sheet is an object sheet, containing a chart or image, then
                # this field will be absent.)
                # When writing it is an error to set any grid properties on non-grid sheets.
              &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
              &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
              &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
              &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
              &quot;rowCount&quot;: 42, # The number of rows in the grid.
              &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
              &quot;columnCount&quot;: 42, # The number of columns in the grid.
            },
            &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
                # This field cannot be changed once set.
            &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
            &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
                # If tab_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
            &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
                # This field cannot be changed once set.
          },
          &quot;conditionalFormats&quot;: [ # The conditional format rules in this sheet.
            { # A rule describing a conditional format.
              &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                  # All the ranges must be on the same grid.
                { # A range on a sheet.
                    # All indexes are zero-based.
                    # Indexes are half open, e.g the start index is inclusive
                    # and the end index is exclusive -- [start_index, end_index).
                    # Missing indexes indicate the range is unbounded on that side.
                    #
                    # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                    #
                    #   `Sheet1!A1:A1 == sheet_id: 0,
                    #                   start_row_index: 0, end_row_index: 1,
                    #                   start_column_index: 0, end_column_index: 1`
                    #
                    #   `Sheet1!A3:B4 == sheet_id: 0,
                    #                   start_row_index: 2, end_row_index: 4,
                    #                   start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A:B == sheet_id: 0,
                    #                 start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1!A5:B == sheet_id: 0,
                    #                  start_row_index: 4,
                    #                  start_column_index: 0, end_column_index: 2`
                    #
                    #   `Sheet1 == sheet_id:0`
                    #
                    # The start index must always be less than or equal to the end index.
                    # If the start index equals the end index, then the range is empty.
                    # Empty ranges are typically not meaningful and are usually rendered in the
                    # UI as `#REF!`.
                  &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                  &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                  &quot;sheetId&quot;: 42, # The sheet this range is on.
                  &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                  &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                },
              ],
              &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                    # the format is applied.
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;format&quot;: { # The format of a cell. # The format to apply.
                    # Conditional formatting can only apply a subset of formatting:
                    # bold, italic,
                    # strikethrough,
                    # foreground color &amp;
                    # background color.
                  &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                  &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                  &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                  &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                    &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                        # the user&#x27;s locale will be used if necessary for the given type.
                        # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                        # more information about the supported patterns.
                    &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                        # When writing, this field must be set.
                  },
                  &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                    &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                      &quot;width&quot;: 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the &quot;style&quot; field.
                      &quot;colorStyle&quot;: { # A color value. # The color of the border.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                    },
                    &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                      &quot;width&quot;: 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the &quot;style&quot; field.
                      &quot;colorStyle&quot;: { # A color value. # The color of the border.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                    },
                    &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                      &quot;width&quot;: 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the &quot;style&quot; field.
                      &quot;colorStyle&quot;: { # A color value. # The color of the border.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                    },
                    &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                      &quot;width&quot;: 42, # The width of the border, in pixels.
                          # Deprecated; the width is determined by the &quot;style&quot; field.
                      &quot;colorStyle&quot;: { # A color value. # The color of the border.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                    },
                  },
                  &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                    &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                        # Measured in degrees. Valid values are between -90 and 90. Positive
                        # angles are angled upwards, negative are angled downwards.
                        #
                        # Note: For LTR text direction positive angles are in the
                        # counterclockwise direction, whereas for RTL they are in the clockwise
                        # direction
                    &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                        # characters is unchanged.
                        # For example:
                        #
                        #     | V |
                        #     | e |
                        #     | r |
                        #     | t |
                        #     | i |
                        #     | c |
                        #     | a |
                        #     | l |
                  },
                  &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                      # If background_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                      # When updating padding, every field must be specified.
                    &quot;right&quot;: 42, # The right padding of the cell.
                    &quot;bottom&quot;: 42, # The bottom padding of the cell.
                    &quot;left&quot;: 42, # The left padding of the cell.
                    &quot;top&quot;: 42, # The top padding of the cell.
                  },
                  &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              },
              &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                  # the interpolation points listed. The format of a cell will vary
                  # based on its contents as compared to the values of the interpolation
                  # points.
                &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                    # These pin the gradient color scale according to the color,
                    # type and value chosen.
                  &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                      # Unused if type is MIN or
                      # MAX.
                  &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
                },
                &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                    # These pin the gradient color scale according to the color,
                    # type and value chosen.
                  &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                      # Unused if type is MIN or
                      # MAX.
                  &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
                },
                &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                    # These pin the gradient color scale according to the color,
                    # type and value chosen.
                  &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                      # Unused if type is MIN or
                      # MAX.
                  &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
                },
              },
            },
          ],
          &quot;data&quot;: [ # Data in the grid, if this is a grid sheet.
              #
              # The number of GridData objects returned is dependent on the number of
              # ranges requested on this sheet. For example, if this is representing
              # `Sheet1`, and the spreadsheet was requested with ranges
              # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
              # startRow/startColumn of `0`,
              # while the second one will have `startRow 14` (zero-based row 15),
              # and `startColumn 3` (zero-based column D).
            { # Data in the grid, as well as metadata about the dimensions.
              &quot;columnMetadata&quot;: [ # Metadata about the requested columns in the grid, starting with the column
                  # in start_column.
                { # Properties about a dimension.
                  &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                  &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                      # This field is read-only.
                  &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                  &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                    { # Developer metadata associated with a location or object in a spreadsheet.
                        # Developer metadata may be used to associate arbitrary data with various
                        # parts of a spreadsheet and will remain associated at those locations as they
                        # move around and the spreadsheet is edited.  For example, if developer
                        # metadata is associated with row 5 and another row is then subsequently
                        # inserted above row 5, that original metadata will still be associated with
                        # the row it was first associated with (what is now row 6). If the associated
                        # object is deleted its metadata is deleted too.
                      &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                          # same key.  Developer metadata must always have a key specified.
                      &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                      &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                          # specified.
                      &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                          # specified when metadata is created, otherwise one will be randomly
                          # generated and assigned. Must be positive.
                      &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                        &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                        &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                        &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                        &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                            # a dimension. The specified DimensionRange must represent a single row
                            # or column; it cannot be unbounded or span multiple rows or columns.
                            # All indexes are zero-based.
                            # Indexes are half open: the start index is inclusive
                            # and the end index is exclusive.
                            # Missing indexes indicate the range is unbounded on that side.
                          &quot;sheetId&quot;: 42, # The sheet this span is on.
                          &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                          &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                          &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                        },
                      },
                    },
                  ],
                },
              ],
              &quot;rowData&quot;: [ # The data in the grid, one entry per row,
                  # starting with the row in startRow.
                  # The values in RowData will correspond to columns starting
                  # at start_column.
                { # Data about each cell in a row.
                  &quot;values&quot;: [ # The values in the row, one per column.
                    { # Data about a specific cell.
                      &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                          # is computed dynamically based on its data, grouping, filters, values,
                          # etc. Only the top-left cell of the pivot table contains the pivot table
                          # definition. The other cells will contain the calculated values of the
                          # results of the pivot in their effective_value fields.
                        &quot;rows&quot;: [ # Each row grouping in the pivot table.
                          { # A single grouping (either row or column) in a pivot table.
                            &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                            &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                            &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                                # If not specified, sorting is alphabetical by this group&#x27;s values.
                              &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                  # grouping should be sorted by.
                              &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                  #
                                  # For example, in a pivot table with one row group &amp; two column groups,
                                  # the row group can list up to two values. The first value corresponds
                                  # to a value within the first column group, and the second value
                                  # corresponds to a value in the second column group.  If no values
                                  # are listed, this would indicate that the row should be sorted according
                                  # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                  # this would correspond to using the &quot;Total&quot; of that bucket.
                                { # The kinds of value that a cell in a spreadsheet can have.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              ],
                            },
                            &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                                # This is only valid for row groupings and is ignored by columns.
                                #
                                # By default, we minimize repitition of headings by not showing higher
                                # level headings where they are the same. For example, even though the
                                # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                                # it is redundant with previous rows. Setting repeat_headings to true
                                # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                                #
                                #     +--------------+
                                #     | Q1     | Jan |
                                #     |        | Feb |
                                #     |        | Mar |
                                #     +--------+-----+
                                #     | Q1 Total     |
                                #     +--------------+
                            &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                              { # Metadata about a value in a pivot grouping.
                                &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                                &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                    # (Note that formulaValue is not valid,
                                    #  because the values will be calculated.)
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                            &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                                #
                                # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                                # means this group refers to column `C`, whereas the offset `1` would
                                # refer to column `D`.
                            &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                                # in the source data column rather than breaking out each individual value.
                                # Only one PivotGroup with a group rule may be added for each column in
                                # the source data, though on any given column you may add both a
                                # PivotGroup that has a rule and a PivotGroup that does not.
                              &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                  # buckets of a constant size. All values from HistogramRule.start to
                                  # HistogramRule.end are placed into groups of size
                                  # HistogramRule.interval. In addition, all values below
                                  # HistogramRule.start are placed in one group, and all values above
                                  # HistogramRule.end are placed in another. Only
                                  # HistogramRule.interval is required, though if HistogramRule.start
                                  # and HistogramRule.end are both provided, HistogramRule.start must
                                  # be less than HistogramRule.end. For example, a pivot table showing
                                  # average purchase amount by age that has 50+ rows:
                                  #
                                  #     +-----+-------------------+
                                  #     | Age | AVERAGE of Amount |
                                  #     +-----+-------------------+
                                  #     | 16  |            $27.13 |
                                  #     | 17  |             $5.24 |
                                  #     | 18  |            $20.15 |
                                  #     ...
                                  #     +-----+-------------------+
                                  # could be turned into a pivot table that looks like the one below by
                                  # applying a histogram group rule with a HistogramRule.start of 25,
                                  # an HistogramRule.interval of 20, and an HistogramRule.end
                                  # of 65.
                                  #
                                  #     +-------------+-------------------+
                                  #     | Grouped Age | AVERAGE of Amount |
                                  #     +-------------+-------------------+
                                  #     | &lt; 25        |            $19.34 |
                                  #     | 25-45       |            $31.43 |
                                  #     | 45-65       |            $35.87 |
                                  #     | &gt; 65        |            $27.55 |
                                  #     +-------------+-------------------+
                                  #     | Grand Total |            $29.12 |
                                  #     +-------------+-------------------+
                                &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                    # of constant size. Values below start are lumped into a single bucket.
                                    # This field is optional.
                                &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                    # of constant size. Values above end are lumped into a single bucket.
                                    # This field is optional.
                                &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                              },
                              &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                  # buckets based on selected parts of their date or time values. For example,
                                  # consider a pivot table showing sales transactions by date:
                                  #
                                  #     +----------+--------------+
                                  #     | Date     | SUM of Sales |
                                  #     +----------+--------------+
                                  #     | 1/1/2017 |      $621.14 |
                                  #     | 2/3/2017 |      $708.84 |
                                  #     | 5/8/2017 |      $326.84 |
                                  #     ...
                                  #     +----------+--------------+
                                  # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                  # results in the following pivot table.
                                  #
                                  #     +--------------+--------------+
                                  #     | Grouped Date | SUM of Sales |
                                  #     +--------------+--------------+
                                  #     | 2017-Jan     |   $53,731.78 |
                                  #     | 2017-Feb     |   $83,475.32 |
                                  #     | 2017-Mar     |   $94,385.05 |
                                  #     ...
                                  #     +--------------+--------------+
                                &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                              },
                              &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                  # buckets with names of your choosing. For example, a pivot table that
                                  # aggregates population by state:
                                  #
                                  #     +-------+-------------------+
                                  #     | State | SUM of Population |
                                  #     +-------+-------------------+
                                  #     | AK    |               0.7 |
                                  #     | AL    |               4.8 |
                                  #     | AR    |               2.9 |
                                  #     ...
                                  #     +-------+-------------------+
                                  # could be turned into a pivot table that aggregates population by time zone
                                  # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                  # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                  # Note that a similar effect could be achieved by adding a time zone column
                                  # to the source data and adjusting the pivot table.
                                  #
                                  #     +-----------+-------------------+
                                  #     | Time Zone | SUM of Population |
                                  #     +-----------+-------------------+
                                  #     | Central   |             106.3 |
                                  #     | Eastern   |             151.9 |
                                  #     | Mountain  |              17.4 |
                                  #     ...
                                  #     +-----------+-------------------+
                                &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                    # that map to each group name.
                                  { # A group name and a list of items from the source data that should be placed
                                      # in the group with this name.
                                    &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                        # item may be a string, number, or boolean. Items may appear in at most one
                                        # group within a given ManualRule. Items that do not appear in any
                                        # group will appear on their own.
                                      { # The kinds of value that a cell in a spreadsheet can have.
                                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                            # This field is read-only.
                                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                              # (in the spreadsheet&#x27;s locale).
                                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                        },
                                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                            # Leading single quotes are not included. For example, if the user typed
                                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                            # `&quot;123&quot;`.
                                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                                            # Note: Dates, Times and DateTimes are represented as doubles in
                                            # &quot;serial number&quot; format.
                                      },
                                    ],
                                    &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                        # ManualRule must have a unique group name.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  },
                                ],
                              },
                            },
                            &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                                # example, in the following pivot table, the row label is `Region` (which
                                # could be renamed to `State`) and the column label is `Product` (which
                                # could be renamed `Item`). Pivot tables created before December 2017 do
                                # not have header labels. If you&#x27;d like to add header labels to an existing
                                # pivot table, please delete the existing pivot table and then create a new
                                # pivot table with same parameters.
                                #
                                #     +--------------+---------+-------+
                                #     | SUM of Units | Product |       |
                                #     | Region       | Pen     | Paper |
                                #     +--------------+---------+-------+
                                #     | New York     |     345 |    98 |
                                #     | Oregon       |     234 |   123 |
                                #     | Tennessee    |     531 |   415 |
                                #     +--------------+---------+-------+
                                #     | Grand Total  |    1110 |   636 |
                                #     +--------------+---------+-------+
                          },
                        ],
                        &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                        &quot;values&quot;: [ # A list of values to include in the pivot table.
                          { # The definition of how a value in a pivot table should be calculated.
                            &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                                # the result of a calculation with another pivot value. For example, if
                                # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                                # pivot values are displayed as the percentage of the grand total. In
                                # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                                # pivot table.
                            &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                                #
                                # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                                # means this value refers to column `C`, whereas the offset `1` would
                                # refer to column `D`.
                            &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                                # with an `=` character.
                            &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                                # If formula is set, the only supported values are
                                # SUM and
                                # CUSTOM.
                                # If sourceColumnOffset is set, then `CUSTOM`
                                # is not supported.
                            &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                          },
                        ],
                        &quot;columns&quot;: [ # Each column grouping in the pivot table.
                          { # A single grouping (either row or column) in a pivot table.
                            &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                            &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                            &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                                # If not specified, sorting is alphabetical by this group&#x27;s values.
                              &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                  # grouping should be sorted by.
                              &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                  #
                                  # For example, in a pivot table with one row group &amp; two column groups,
                                  # the row group can list up to two values. The first value corresponds
                                  # to a value within the first column group, and the second value
                                  # corresponds to a value in the second column group.  If no values
                                  # are listed, this would indicate that the row should be sorted according
                                  # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                  # this would correspond to using the &quot;Total&quot; of that bucket.
                                { # The kinds of value that a cell in a spreadsheet can have.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              ],
                            },
                            &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                                # This is only valid for row groupings and is ignored by columns.
                                #
                                # By default, we minimize repitition of headings by not showing higher
                                # level headings where they are the same. For example, even though the
                                # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                                # it is redundant with previous rows. Setting repeat_headings to true
                                # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                                #
                                #     +--------------+
                                #     | Q1     | Jan |
                                #     |        | Feb |
                                #     |        | Mar |
                                #     +--------+-----+
                                #     | Q1 Total     |
                                #     +--------------+
                            &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                              { # Metadata about a value in a pivot grouping.
                                &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                                &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                    # (Note that formulaValue is not valid,
                                    #  because the values will be calculated.)
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                            &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                                #
                                # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                                # means this group refers to column `C`, whereas the offset `1` would
                                # refer to column `D`.
                            &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                                # in the source data column rather than breaking out each individual value.
                                # Only one PivotGroup with a group rule may be added for each column in
                                # the source data, though on any given column you may add both a
                                # PivotGroup that has a rule and a PivotGroup that does not.
                              &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                  # buckets of a constant size. All values from HistogramRule.start to
                                  # HistogramRule.end are placed into groups of size
                                  # HistogramRule.interval. In addition, all values below
                                  # HistogramRule.start are placed in one group, and all values above
                                  # HistogramRule.end are placed in another. Only
                                  # HistogramRule.interval is required, though if HistogramRule.start
                                  # and HistogramRule.end are both provided, HistogramRule.start must
                                  # be less than HistogramRule.end. For example, a pivot table showing
                                  # average purchase amount by age that has 50+ rows:
                                  #
                                  #     +-----+-------------------+
                                  #     | Age | AVERAGE of Amount |
                                  #     +-----+-------------------+
                                  #     | 16  |            $27.13 |
                                  #     | 17  |             $5.24 |
                                  #     | 18  |            $20.15 |
                                  #     ...
                                  #     +-----+-------------------+
                                  # could be turned into a pivot table that looks like the one below by
                                  # applying a histogram group rule with a HistogramRule.start of 25,
                                  # an HistogramRule.interval of 20, and an HistogramRule.end
                                  # of 65.
                                  #
                                  #     +-------------+-------------------+
                                  #     | Grouped Age | AVERAGE of Amount |
                                  #     +-------------+-------------------+
                                  #     | &lt; 25        |            $19.34 |
                                  #     | 25-45       |            $31.43 |
                                  #     | 45-65       |            $35.87 |
                                  #     | &gt; 65        |            $27.55 |
                                  #     +-------------+-------------------+
                                  #     | Grand Total |            $29.12 |
                                  #     +-------------+-------------------+
                                &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                    # of constant size. Values below start are lumped into a single bucket.
                                    # This field is optional.
                                &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                    # of constant size. Values above end are lumped into a single bucket.
                                    # This field is optional.
                                &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                              },
                              &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                  # buckets based on selected parts of their date or time values. For example,
                                  # consider a pivot table showing sales transactions by date:
                                  #
                                  #     +----------+--------------+
                                  #     | Date     | SUM of Sales |
                                  #     +----------+--------------+
                                  #     | 1/1/2017 |      $621.14 |
                                  #     | 2/3/2017 |      $708.84 |
                                  #     | 5/8/2017 |      $326.84 |
                                  #     ...
                                  #     +----------+--------------+
                                  # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                  # results in the following pivot table.
                                  #
                                  #     +--------------+--------------+
                                  #     | Grouped Date | SUM of Sales |
                                  #     +--------------+--------------+
                                  #     | 2017-Jan     |   $53,731.78 |
                                  #     | 2017-Feb     |   $83,475.32 |
                                  #     | 2017-Mar     |   $94,385.05 |
                                  #     ...
                                  #     +--------------+--------------+
                                &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                              },
                              &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                  # buckets with names of your choosing. For example, a pivot table that
                                  # aggregates population by state:
                                  #
                                  #     +-------+-------------------+
                                  #     | State | SUM of Population |
                                  #     +-------+-------------------+
                                  #     | AK    |               0.7 |
                                  #     | AL    |               4.8 |
                                  #     | AR    |               2.9 |
                                  #     ...
                                  #     +-------+-------------------+
                                  # could be turned into a pivot table that aggregates population by time zone
                                  # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                  # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                  # Note that a similar effect could be achieved by adding a time zone column
                                  # to the source data and adjusting the pivot table.
                                  #
                                  #     +-----------+-------------------+
                                  #     | Time Zone | SUM of Population |
                                  #     +-----------+-------------------+
                                  #     | Central   |             106.3 |
                                  #     | Eastern   |             151.9 |
                                  #     | Mountain  |              17.4 |
                                  #     ...
                                  #     +-----------+-------------------+
                                &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                    # that map to each group name.
                                  { # A group name and a list of items from the source data that should be placed
                                      # in the group with this name.
                                    &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                        # item may be a string, number, or boolean. Items may appear in at most one
                                        # group within a given ManualRule. Items that do not appear in any
                                        # group will appear on their own.
                                      { # The kinds of value that a cell in a spreadsheet can have.
                                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                            # This field is read-only.
                                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                              # (in the spreadsheet&#x27;s locale).
                                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                        },
                                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                            # Leading single quotes are not included. For example, if the user typed
                                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                            # `&quot;123&quot;`.
                                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                                            # Note: Dates, Times and DateTimes are represented as doubles in
                                            # &quot;serial number&quot; format.
                                      },
                                    ],
                                    &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                        # ManualRule must have a unique group name.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  },
                                ],
                              },
                            },
                            &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                                # example, in the following pivot table, the row label is `Region` (which
                                # could be renamed to `State`) and the column label is `Product` (which
                                # could be renamed `Item`). Pivot tables created before December 2017 do
                                # not have header labels. If you&#x27;d like to add header labels to an existing
                                # pivot table, please delete the existing pivot table and then create a new
                                # pivot table with same parameters.
                                #
                                #     +--------------+---------+-------+
                                #     | SUM of Units | Product |       |
                                #     | Region       | Pen     | Paper |
                                #     +--------------+---------+-------+
                                #     | New York     |     345 |    98 |
                                #     | Oregon       |     234 |   123 |
                                #     | Tennessee    |     531 |   415 |
                                #     +--------------+---------+-------+
                                #     | Grand Total  |    1110 |   636 |
                                #     +--------------+---------+-------+
                          },
                        ],
                        &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                            # or vertically (as rows).
                        &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                            #
                            # The filters are applied before aggregating data into the pivot table.
                            # The map&#x27;s key is the column offset of the source range that you want to
                            # filter, and the value is the criteria for that column.
                            #
                            # For example, if the source was `C10:E15`, a key of `0` will have the filter
                            # for column `C`, whereas the key `1` is for column `D`.
                          &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                            &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                              &quot;A String&quot;,
                            ],
                          },
                        },
                      },
                      &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                          # This is the value as it&#x27;s shown to the user.
                          # This field is read-only.
                      &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                          # on user entered strings, not formulas, bools, or numbers.
                          # Runs start at specific indexes in the text and continue until the next
                          # run. Properties of a run will continue unless explicitly changed
                          # in a subsequent run (and properties of the first run will continue
                          # the properties of the cell unless explicitly changed).
                          #
                          # When writing, the new runs will overwrite any prior runs.  When writing a
                          # new user_entered_value, previous runs are erased.
                        { # A run of a text format. The format of this run continues until the start
                            # index of the next run.
                            # When updating, all fields must be set.
                          &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                              # Absent values indicate that the field isn&#x27;t specified.
                            &quot;fontSize&quot;: 42, # The size of the font.
                            &quot;underline&quot;: True or False, # True if the text is underlined.
                            &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                                # If foreground_color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;bold&quot;: True or False, # True if the text is bold.
                            &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;italic&quot;: True or False, # True if the text is italicized.
                            &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                            &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                          },
                          &quot;startIndex&quot;: 42, # The character index where this run starts.
                        },
                      ],
                      &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                          # the calculated value.  For cells with literals, this is
                          # the same as the user_entered_value.
                          # This field is read-only.
                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                              # (in the spreadsheet&#x27;s locale).
                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                        },
                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                            # `&quot;123&quot;`.
                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # &quot;serial number&quot; format.
                      },
                      &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                          # This includes the results of applying any conditional formatting and,
                          # if the cell contains a formula, the computed number format.
                          # If the effective format is the default format, effective format will
                          # not be written.
                          # This field is read-only.
                        &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                        &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                        &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                        &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                        &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                          &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                              # the user&#x27;s locale will be used if necessary for the given type.
                              # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                              # more information about the supported patterns.
                          &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                              # When writing, this field must be set.
                        },
                        &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                          &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                          &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                          &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                          &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                        },
                        &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                        &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                            # Absent values indicate that the field isn&#x27;t specified.
                          &quot;fontSize&quot;: 42, # The size of the font.
                          &quot;underline&quot;: True or False, # True if the text is underlined.
                          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                              # If foreground_color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;bold&quot;: True or False, # True if the text is bold.
                          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;italic&quot;: True or False, # True if the text is italicized.
                          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                        },
                        &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                          &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                              # Measured in degrees. Valid values are between -90 and 90. Positive
                              # angles are angled upwards, negative are angled downwards.
                              #
                              # Note: For LTR text direction positive angles are in the
                              # counterclockwise direction, whereas for RTL they are in the clockwise
                              # direction
                          &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                              # characters is unchanged.
                              # For example:
                              #
                              #     | V |
                              #     | e |
                              #     | r |
                              #     | t |
                              #     | i |
                              #     | c |
                              #     | a |
                              #     | l |
                        },
                        &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                            # If background_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                            # When updating padding, every field must be specified.
                          &quot;right&quot;: 42, # The right padding of the cell.
                          &quot;bottom&quot;: 42, # The bottom padding of the cell.
                          &quot;left&quot;: 42, # The left padding of the cell.
                          &quot;top&quot;: 42, # The top padding of the cell.
                        },
                        &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                      &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                          #
                          # When writing, the new format will be merged with the existing format.
                        &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                        &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                        &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                        &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                        &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                          &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                              # the user&#x27;s locale will be used if necessary for the given type.
                              # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                              # more information about the supported patterns.
                          &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                              # When writing, this field must be set.
                        },
                        &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                          &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                          &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                          &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                          &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                            &quot;width&quot;: 42, # The width of the border, in pixels.
                                # Deprecated; the width is determined by the &quot;style&quot; field.
                            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                                # If color is also set, this field takes precedence.
                              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                  # for simplicity of conversion to/from color representations in various
                                  # languages over compactness; for example, the fields of this representation
                                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                  # method in iOS; and, with just a little work, it can be easily formatted into
                                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                  #
                                  # Note: this proto does not carry information about the absolute color space
                                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                  # space.
                                  #
                                  # Example (Java):
                                  #
                                  #      import com.google.type.Color;
                                  #
                                  #      // ...
                                  #      public static java.awt.Color fromProto(Color protocolor) {
                                  #        float alpha = protocolor.hasAlpha()
                                  #            ? protocolor.getAlpha().getValue()
                                  #            : 1.0;
                                  #
                                  #        return new java.awt.Color(
                                  #            protocolor.getRed(),
                                  #            protocolor.getGreen(),
                                  #            protocolor.getBlue(),
                                  #            alpha);
                                  #      }
                                  #
                                  #      public static Color toProto(java.awt.Color color) {
                                  #        float red = (float) color.getRed();
                                  #        float green = (float) color.getGreen();
                                  #        float blue = (float) color.getBlue();
                                  #        float denominator = 255.0;
                                  #        Color.Builder resultBuilder =
                                  #            Color
                                  #                .newBuilder()
                                  #                .setRed(red / denominator)
                                  #                .setGreen(green / denominator)
                                  #                .setBlue(blue / denominator);
                                  #        int alpha = color.getAlpha();
                                  #        if (alpha != 255) {
                                  #          result.setAlpha(
                                  #              FloatValue
                                  #                  .newBuilder()
                                  #                  .setValue(((float) alpha) / denominator)
                                  #                  .build());
                                  #        }
                                  #        return resultBuilder.build();
                                  #      }
                                  #      // ...
                                  #
                                  # Example (iOS / Obj-C):
                                  #
                                  #      // ...
                                  #      static UIColor* fromProto(Color* protocolor) {
                                  #         float red = [protocolor red];
                                  #         float green = [protocolor green];
                                  #         float blue = [protocolor blue];
                                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                                  #         float alpha = 1.0;
                                  #         if (alpha_wrapper != nil) {
                                  #           alpha = [alpha_wrapper value];
                                  #         }
                                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                  #      }
                                  #
                                  #      static Color* toProto(UIColor* color) {
                                  #          CGFloat red, green, blue, alpha;
                                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                  #            return nil;
                                  #          }
                                  #          Color* result = [[Color alloc] init];
                                  #          [result setRed:red];
                                  #          [result setGreen:green];
                                  #          [result setBlue:blue];
                                  #          if (alpha &lt;= 0.9999) {
                                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                                  #          }
                                  #          [result autorelease];
                                  #          return result;
                                  #     }
                                  #     // ...
                                  #
                                  #  Example (JavaScript):
                                  #
                                  #     // ...
                                  #
                                  #     var protoToCssColor = function(rgb_color) {
                                  #        var redFrac = rgb_color.red || 0.0;
                                  #        var greenFrac = rgb_color.green || 0.0;
                                  #        var blueFrac = rgb_color.blue || 0.0;
                                  #        var red = Math.floor(redFrac * 255);
                                  #        var green = Math.floor(greenFrac * 255);
                                  #        var blue = Math.floor(blueFrac * 255);
                                  #
                                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                  #           return rgbToCssColor_(red, green, blue);
                                  #        }
                                  #
                                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     var rgbToCssColor_ = function(red, green, blue) {
                                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                  #       var hexString = rgbNumber.toString(16);
                                  #       var missingZeros = 6 - hexString.length;
                                  #       var resultBuilder = [&#x27;#&#x27;];
                                  #       for (var i = 0; i &lt; missingZeros; i++) {
                                  #          resultBuilder.push(&#x27;0&#x27;);
                                  #       }
                                  #       resultBuilder.push(hexString);
                                  #       return resultBuilder.join(&#x27;&#x27;);
                                  #     };
                                  #
                                  #     // ...
                                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                    # the final pixel color is defined by the equation:
                                    #
                                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                    #
                                    # This means that a value of 1.0 corresponds to a solid color, whereas
                                    # a value of 0.0 corresponds to a completely transparent color. This
                                    # uses a wrapper message rather than a simple float scalar so that it is
                                    # possible to distinguish between a default value and the value being unset.
                                    # If omitted, this color object is to be rendered as a solid color
                                    # (as if the alpha value had been explicitly given with a value of 1.0).
                                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                              },
                            },
                            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                          },
                        },
                        &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                        &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                            # Absent values indicate that the field isn&#x27;t specified.
                          &quot;fontSize&quot;: 42, # The size of the font.
                          &quot;underline&quot;: True or False, # True if the text is underlined.
                          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                              # If foreground_color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;bold&quot;: True or False, # True if the text is bold.
                          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;italic&quot;: True or False, # True if the text is italicized.
                          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                        },
                        &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                          &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                              # Measured in degrees. Valid values are between -90 and 90. Positive
                              # angles are angled upwards, negative are angled downwards.
                              #
                              # Note: For LTR text direction positive angles are in the
                              # counterclockwise direction, whereas for RTL they are in the clockwise
                              # direction
                          &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                              # characters is unchanged.
                              # For example:
                              #
                              #     | V |
                              #     | e |
                              #     | r |
                              #     | t |
                              #     | i |
                              #     | c |
                              #     | a |
                              #     | l |
                        },
                        &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                            # If background_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                            # When updating padding, every field must be specified.
                          &quot;right&quot;: 42, # The right padding of the cell.
                          &quot;bottom&quot;: 42, # The bottom padding of the cell.
                          &quot;left&quot;: 42, # The left padding of the cell.
                          &quot;top&quot;: 42, # The top padding of the cell.
                        },
                        &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # serial number format.
                        &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                            # This field is read-only.
                          &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                              # (in the spreadsheet&#x27;s locale).
                          &quot;type&quot;: &quot;A String&quot;, # The type of error.
                        },
                        &quot;boolValue&quot;: True or False, # Represents a boolean value.
                        &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                            # Leading single quotes are not included. For example, if the user typed
                            # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                            # `&quot;123&quot;`.
                        &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                        &quot;numberValue&quot;: 3.14, # Represents a double value.
                            # Note: Dates, Times and DateTimes are represented as doubles in
                            # &quot;serial number&quot; format.
                      },
                      &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                          #
                          # When writing, the new data validation rule will overwrite any prior rule.
                        &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                            # If true, &quot;List&quot; conditions will show a dropdown.
                        &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                        &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                        &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                            # BooleanConditions are used by conditional formatting,
                            # data validation, and the criteria in filters.
                          &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                              # on the condition type.  Some support zero values,
                              # others one or two values,
                              # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                            { # The value of the condition.
                              &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                                  # Valid only if the type is
                                  # DATE_BEFORE,
                                  # DATE_AFTER,
                                  # DATE_ON_OR_BEFORE or
                                  # DATE_ON_OR_AFTER.
                                  #
                                  # Relative dates are not supported in data validation.
                                  # They are supported only in conditional formatting and
                                  # conditional filters.
                              &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                                  # The value is parsed as if the user typed into a cell.
                                  # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                            },
                          ],
                          &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                        },
                      },
                      &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                          # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                          # in the userEnteredValue.formulaValue
                          # field.)
                    },
                  ],
                },
              ],
              &quot;rowMetadata&quot;: [ # Metadata about the requested rows in the grid, starting with the row
                  # in start_row.
                { # Properties about a dimension.
                  &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                  &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                      # This field is read-only.
                  &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                  &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                    { # Developer metadata associated with a location or object in a spreadsheet.
                        # Developer metadata may be used to associate arbitrary data with various
                        # parts of a spreadsheet and will remain associated at those locations as they
                        # move around and the spreadsheet is edited.  For example, if developer
                        # metadata is associated with row 5 and another row is then subsequently
                        # inserted above row 5, that original metadata will still be associated with
                        # the row it was first associated with (what is now row 6). If the associated
                        # object is deleted its metadata is deleted too.
                      &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                          # same key.  Developer metadata must always have a key specified.
                      &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                      &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                          # specified.
                      &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                          # specified when metadata is created, otherwise one will be randomly
                          # generated and assigned. Must be positive.
                      &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                        &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                        &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                        &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                        &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                            # a dimension. The specified DimensionRange must represent a single row
                            # or column; it cannot be unbounded or span multiple rows or columns.
                            # All indexes are zero-based.
                            # Indexes are half open: the start index is inclusive
                            # and the end index is exclusive.
                            # Missing indexes indicate the range is unbounded on that side.
                          &quot;sheetId&quot;: 42, # The sheet this span is on.
                          &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                          &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                          &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                        },
                      },
                    },
                  ],
                },
              ],
              &quot;startColumn&quot;: 42, # The first column this GridData refers to, zero-based.
              &quot;startRow&quot;: 42, # The first row this GridData refers to, zero-based.
            },
          ],
        },
      ],
      &quot;spreadsheetId&quot;: &quot;A String&quot;, # The ID of the spreadsheet.
          # This field is read-only.
      &quot;properties&quot;: { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
        &quot;title&quot;: &quot;A String&quot;, # The title of the spreadsheet.
        &quot;defaultFormat&quot;: { # The format of a cell. # The default format of all cells in the spreadsheet.
            # CellData.effectiveFormat will not be set if
            # the cell&#x27;s format is equal to this default format. This field is read-only.
          &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
          &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
          &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
          &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
          &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
            &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                # the user&#x27;s locale will be used if necessary for the given type.
                # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                # more information about the supported patterns.
            &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                # When writing, this field must be set.
          },
          &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
            &quot;left&quot;: { # A border along a cell. # The left border of the cell.
              &quot;width&quot;: 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the &quot;style&quot; field.
              &quot;colorStyle&quot;: { # A color value. # The color of the border.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;style&quot;: &quot;A String&quot;, # The style of the border.
            },
            &quot;top&quot;: { # A border along a cell. # The top border of the cell.
              &quot;width&quot;: 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the &quot;style&quot; field.
              &quot;colorStyle&quot;: { # A color value. # The color of the border.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;style&quot;: &quot;A String&quot;, # The style of the border.
            },
            &quot;right&quot;: { # A border along a cell. # The right border of the cell.
              &quot;width&quot;: 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the &quot;style&quot; field.
              &quot;colorStyle&quot;: { # A color value. # The color of the border.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;style&quot;: &quot;A String&quot;, # The style of the border.
            },
            &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
              &quot;width&quot;: 42, # The width of the border, in pixels.
                  # Deprecated; the width is determined by the &quot;style&quot; field.
              &quot;colorStyle&quot;: { # A color value. # The color of the border.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;style&quot;: &quot;A String&quot;, # The style of the border.
            },
          },
          &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
          &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
              # Absent values indicate that the field isn&#x27;t specified.
            &quot;fontSize&quot;: 42, # The size of the font.
            &quot;underline&quot;: True or False, # True if the text is underlined.
            &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                # If foreground_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;bold&quot;: True or False, # True if the text is bold.
            &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;italic&quot;: True or False, # True if the text is italicized.
            &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
            &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
          },
          &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
            &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                # Measured in degrees. Valid values are between -90 and 90. Positive
                # angles are angled upwards, negative are angled downwards.
                #
                # Note: For LTR text direction positive angles are in the
                # counterclockwise direction, whereas for RTL they are in the clockwise
                # direction
            &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                # characters is unchanged.
                # For example:
                #
                #     | V |
                #     | e |
                #     | r |
                #     | t |
                #     | i |
                #     | c |
                #     | a |
                #     | l |
          },
          &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
              # If background_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
              # When updating padding, every field must be specified.
            &quot;right&quot;: 42, # The right padding of the cell.
            &quot;bottom&quot;: 42, # The bottom padding of the cell.
            &quot;left&quot;: 42, # The left padding of the cell.
            &quot;top&quot;: 42, # The top padding of the cell.
          },
          &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
        },
        &quot;autoRecalc&quot;: &quot;A String&quot;, # The amount of time to wait before volatile functions are recalculated.
        &quot;iterativeCalculationSettings&quot;: { # Settings to control how circular dependencies are resolved with iterative # Determines whether and how circular references are resolved with iterative
            # calculation.  Absence of this field means that circular references result
            # in calculation errors.
            # calculation.
          &quot;maxIterations&quot;: 42, # When iterative calculation is enabled, the maximum number of calculation
              # rounds to perform.
          &quot;convergenceThreshold&quot;: 3.14, # When iterative calculation is enabled and successive results differ by
              # less than this threshold value, the calculation rounds stop.
        },
        &quot;timeZone&quot;: &quot;A String&quot;, # The time zone of the spreadsheet, in CLDR format such as
            # `America/New_York`. If the time zone isn&#x27;t recognized, this may
            # be a custom time zone such as `GMT-07:00`.
        &quot;spreadsheetTheme&quot;: { # Represents spreadsheet theme # Theme applied to the spreadsheet.
          &quot;primaryFontFamily&quot;: &quot;A String&quot;, # / Name of the primary font family.
          &quot;themeColors&quot;: [ # The spreadsheet theme color pairs. To update you must provide all theme
              # color pairs.
            { # A pair mapping a spreadsheet theme color type to the concrete color it
                # represents.
              &quot;colorType&quot;: &quot;A String&quot;, # The type of the spreadsheet theme color.
              &quot;color&quot;: { # A color value. # The concrete color corresponding to the theme color type.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
          ],
        },
        &quot;locale&quot;: &quot;A String&quot;, # The locale of the spreadsheet in one of the following formats:
            #
            # * an ISO 639-1 language code such as `en`
            #
            # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
            #
            # * a combination of the ISO language code and country code, such as `en_US`
            #
            # Note: when updating this field, not all locales/languages are supported.
      },
      &quot;namedRanges&quot;: [ # The named ranges defined in a spreadsheet.
        { # A named range.
          &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
          &quot;range&quot;: { # A range on a sheet. # The range this represents.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
        },
      ],
      &quot;developerMetadata&quot;: [ # The developer metadata associated with a spreadsheet.
        { # Developer metadata associated with a location or object in a spreadsheet.
            # Developer metadata may be used to associate arbitrary data with various
            # parts of a spreadsheet and will remain associated at those locations as they
            # move around and the spreadsheet is edited.  For example, if developer
            # metadata is associated with row 5 and another row is then subsequently
            # inserted above row 5, that original metadata will still be associated with
            # the row it was first associated with (what is now row 6). If the associated
            # object is deleted its metadata is deleted too.
          &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
              # same key.  Developer metadata must always have a key specified.
          &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
          &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
              # specified.
          &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
              # specified when metadata is created, otherwise one will be randomly
              # generated and assigned. Must be positive.
          &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
            &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
            &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
            &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
            &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                # a dimension. The specified DimensionRange must represent a single row
                # or column; it cannot be unbounded or span multiple rows or columns.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        },
      ],
    },
  }</pre>
</div>

<div class="method">
    <code class="details" id="create">create(body=None, x__xgafv=None)</code>
  <pre>Creates a spreadsheet, returning the newly created spreadsheet.

Args:
  body: object, The request body.
    The object takes the form of:

{ # Resource that represents a spreadsheet.
  &quot;spreadsheetUrl&quot;: &quot;A String&quot;, # The url of the spreadsheet.
      # This field is read-only.
  &quot;sheets&quot;: [ # The sheets that are part of a spreadsheet.
    { # A sheet in a spreadsheet.
      &quot;rowGroups&quot;: [ # All row groups on this sheet, ordered by increasing range start index, then
          # by group depth.
        { # A group over an interval of rows or columns on a sheet, which can contain or
            # be contained within other groups. A group can be collapsed or expanded as a
            # unit on the sheet.
          &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
              # wholly contains the range of this group.
          &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
              # collapsed if an overlapping group at a shallower depth is expanded.
              #
              # A true value does not imply that all dimensions within the group are
              # hidden, since a dimension&#x27;s visibility can change independently from this
              # group property. However, when this property is updated, all dimensions
              # within it are set to hidden if this field is true, or set to visible if
              # this field is false.
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
      ],
      &quot;columnGroups&quot;: [ # All column groups on this sheet, ordered by increasing range start index,
          # then by group depth.
        { # A group over an interval of rows or columns on a sheet, which can contain or
            # be contained within other groups. A group can be collapsed or expanded as a
            # unit on the sheet.
          &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
              # wholly contains the range of this group.
          &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
              # collapsed if an overlapping group at a shallower depth is expanded.
              #
              # A true value does not imply that all dimensions within the group are
              # hidden, since a dimension&#x27;s visibility can change independently from this
              # group property. However, when this property is updated, all dimensions
              # within it are set to hidden if this field is true, or set to visible if
              # this field is false.
          &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
      ],
      &quot;slicers&quot;: [ # The slicers on this sheet.
        { # A slicer in a sheet.
          &quot;slicerId&quot;: 42, # The ID of the slicer.
          &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
            &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
              &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                  # shown. Mutually exclusive with visible_foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hidden_values -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                  # are shown. Mutually exclusive with visible_background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                  # shown. This field is mutually exclusive with visible_foreground_color,
                  # and must be set to an RGB-type color. If visible_background_color is
                  # also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                  # are shown. This field is mutually exclusive with
                  # visible_background_color, and must be set to an RGB-type color. If
                  # visible_foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;hiddenValues&quot;: [ # Values that should be hidden.
                &quot;A String&quot;,
              ],
            },
            &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                # Absent values indicate that the field isn&#x27;t specified.
              &quot;fontSize&quot;: 42, # The size of the font.
              &quot;underline&quot;: True or False, # True if the text is underlined.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                  # If foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;bold&quot;: True or False, # True if the text is bold.
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;italic&quot;: True or False, # True if the text is italicized.
              &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
            },
            &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
            &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                # If background_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                # If not set, default to `True`.
            &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
            &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                # If unspecified, defaults to `LEFT`
            &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
              # existing sheet. Also, width and height of slicer can be automatically
              # adjusted to keep it within permitted limits.
            &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
              },
              &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
              &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
            },
            &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
          },
        },
      ],
      &quot;developerMetadata&quot;: [ # The developer metadata associated with a sheet.
        { # Developer metadata associated with a location or object in a spreadsheet.
            # Developer metadata may be used to associate arbitrary data with various
            # parts of a spreadsheet and will remain associated at those locations as they
            # move around and the spreadsheet is edited.  For example, if developer
            # metadata is associated with row 5 and another row is then subsequently
            # inserted above row 5, that original metadata will still be associated with
            # the row it was first associated with (what is now row 6). If the associated
            # object is deleted its metadata is deleted too.
          &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
              # same key.  Developer metadata must always have a key specified.
          &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
          &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
              # specified.
          &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
              # specified when metadata is created, otherwise one will be randomly
              # generated and assigned. Must be positive.
          &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
            &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
            &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
            &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
            &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                # a dimension. The specified DimensionRange must represent a single row
                # or column; it cannot be unbounded or span multiple rows or columns.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        },
      ],
      &quot;filterViews&quot;: [ # The filter views in this sheet.
        { # A filter view.
          &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
              # The map&#x27;s key is the column index, and the value is the criteria for
              # that column.
            &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
              &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                  # shown. Mutually exclusive with visible_foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hidden_values -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                  # are shown. Mutually exclusive with visible_background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                  # shown. This field is mutually exclusive with visible_foreground_color,
                  # and must be set to an RGB-type color. If visible_background_color is
                  # also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                  # are shown. This field is mutually exclusive with
                  # visible_background_color, and must be set to an RGB-type color. If
                  # visible_foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;hiddenValues&quot;: [ # Values that should be hidden.
                &quot;A String&quot;,
              ],
            },
          },
          &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
              #
              # When writing, only one of range or named_range_id
              # may be set.
          &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color, and must be an
                  # RGB-type color. If background_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
              &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color, and must
                  # be an RGB-type color. If foreground_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          ],
          &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
          &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
              #
              # When writing, only one of range or named_range_id
              # may be set.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;filterViewId&quot;: 42, # The ID of the filter view.
        },
      ],
      &quot;charts&quot;: [ # The specifications of every chart on this sheet.
        { # A chart embedded in a sheet.
          &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
            &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                # chart&lt;/a&gt;.
              &quot;data&quot;: [ # The Candlestick chart data.
                  # Only one CandlestickData is supported.
                { # The Candlestick chart data, each containing the low, open, close, and high
                    # values for a series.
                  &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                      # candle. This is the bottom of the candle body.  If less than the close
                      # value the candle will be filled.  Otherwise the candle will be hollow.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                      # candle. This is the top of the candle&#x27;s center line.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                      # This is the top of the candle body.  If greater than the open value the
                      # candle will be filled.  Otherwise the candle will be hollow.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                  &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                      # This is the bottom of the candle&#x27;s center line.
                    &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                  },
                },
              ],
              &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                  # will be treated as discrete labels, other data will be treated as
                  # continuous values.
                &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
            },
            &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                # A histogram chart groups data items into bins, displaying each bin as a
                # column of stacked items.  Histograms are used to display the distribution
                # of a dataset.  Each column of items represents a range into which those
                # items fall.  The number of bins can be chosen automatically or specified
                # explicitly.
              &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                  # column.
              &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                  # bucketed or multiple series, each of the same length, containing the name
                  # of the series followed by the values to be bucketed for that series.
                { # A histogram series containing the series color and data.
                  &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                      # This field is optional.
                      # If bar_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                      # This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              ],
              &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
              &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                  # column) is chosen automatically, but it may be overridden here.
                  # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                  # Cannot be negative.
                  # This field is optional.
              &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                  # affect the calculation of bucket sizes.  For example, setting an outlier
                  # percentile of 0.05 indicates that the top and bottom 5% of values when
                  # calculating buckets.  The values are still included in the chart, they will
                  # be added to the first or last buckets instead of their own buckets.
                  # Must be between 0.0 and 0.5.
            },
            &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                # Not applicable to Org charts.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
              &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                  # on the treemap chart. These levels are not interactive and are shown
                  # without their labels. Defaults to 0 if not specified.
              &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                  # interactive and are shown with their labels. Defaults to 2 if not
                  # specified.
              &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                  # assigned colors based on their color values. These color values come from
                  # color_data, or from size_data if color_data is not specified.
                  # Cells with color values less than or equal to min_value will
                  # have minValueColor as their
                  # background color. Cells with color values greater than or equal to
                  # max_value will have
                  # maxValueColor as their background
                  # color. Cells with color values between min_value and max_value will
                  # have background colors on a gradient between
                  # minValueColor and
                  # maxValueColor, the midpoint of
                  # the gradient being midValueColor.
                  # Cells with missing or non-numeric color values will have
                  # noDataColor as their background
                  # color.
                &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                    # them. Defaults to #000000 if not specified.
                    # If no_data_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                    # minValue. Defaults to #dc3912 if not
                    # specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                    # minValue. Defaults to #dc3912 if not
                    # specified.
                    # If min_value_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                    # minValue and
                    # maxValue. Defaults to #efe6dc if not
                    # specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                    # them. Defaults to #000000 if not specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                    # to maxValue. Defaults to #109618 if not
                    # specified.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                    # minValue and
                    # maxValue. Defaults to #efe6dc if not
                    # specified.
                    # If mid_value_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                    # to maxValue. Defaults to #109618 if not
                    # specified.
                    # If max_value_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                  # If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                  # have the same color as cells with this value. If not specified, defaults
                  # to the actual minimum value from color_data, or the minimum value from
                  # size_data if color_data is not specified.
              &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                  # have the same color as cells with this value. If not specified, defaults
                  # to the actual maximum value from color_data, or the maximum value from
                  # size_data if color_data is not specified.
              &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                  # This field is optional. If not specified, size_data is used to
                  # determine background colors. If specified, the data is expected to be
                  # numeric. color_scale will determine how the values in this data map to
                  # data cell background colors.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                  # expected to be numeric. The cells corresponding to non-numeric or missing
                  # data will not be rendered. If color_data is not specified, this data
                  # is used to determine data cell background colors as well.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
            },
            &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                # See BasicChartType for the list of all
                # charts this supports.
                # of charts this supports.
              &quot;series&quot;: [ # The data this chart is visualizing.
                { # A single series of data in a chart.
                    # For example, if charting stock prices over time, multiple series may exist,
                    # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                  &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                      # chartType is AREA,
                      # LINE, or SCATTER.
                      # COMBO charts are also supported if the
                      # series chart type is
                      # AREA or LINE.
                    &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                    &quot;width&quot;: 42, # The thickness of the line, in px.
                  },
                  &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                      # this series.  If empty, a default color is used.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                      # For example, if charting stocks over time, the &quot;Volume&quot; series
                      # may want to be pinned to the right with the prices pinned to the left,
                      # because the scale of trading volume is different than the scale of
                      # prices.
                      # It is an error to specify an axis that isn&#x27;t a valid minor axis
                      # for the chart&#x27;s type.
                  &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                      # chartType is
                      # COMBO.
                      # Different types will change the way the series is visualized.
                      # Only LINE, AREA,
                      # and COLUMN are supported.
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                      # this series.  If empty, a default color is used.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
              ],
              &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
              &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                  # Applies to Bar and Column charts.
              &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                  # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
              &quot;domains&quot;: [ # The domain of data this is charting.
                  # Only a single domain is supported.
                { # The domain of a chart.
                    # For example, if charting stock prices over time, this would be the date.
                  &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                      # this is the data representing the dates.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                },
              ],
              &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                  # Applies to Line charts.
              &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                  # If not set, Google Sheets will guess how many rows are headers based
                  # on the data.
                  #
                  # (Note that BasicChartAxis.title may override the axis title
                  #  inferred from the header values.)
              &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                  # chart area.
              &quot;axis&quot;: [ # The axis on the chart.
                { # An axis of the chart.
                    # A chart may not have more than one axis per
                    # axis position.
                  &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                      # from headers of the data.
                  &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                  &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                      # Only valid if the axis is not associated with the domain.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                      # values in an axis).
                    &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                        # automatically determine a minimum value that looks good for the data.
                    &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                    &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                        # automatically determine a maximum value that looks good for the data.
                  },
                },
              ],
              &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
              &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                  # segments of lines in a line chart will be missing).  To eliminate these
                  # gaps set this to true.
                  # Applies to Line, Area, and Combo charts.
            },
            &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
            &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
              &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
              &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
              &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                &quot;width&quot;: 42, # The thickness of the line, in px.
              },
              &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                { # A single series of data for a waterfall chart.
                  &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                      # subtotals are defined is not significant. Only one subtotal may be
                      # defined for each data point.
                    { # A custom subtotal column for a waterfall chart series.
                      &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                          # data_is_subtotal is true, the data point at this index is the
                          # subtotal. Otherwise, the subtotal appears after the data point with
                          # this index. A series can have multiple subtotals at arbitrary indices,
                          # but subtotals do not affect the indices of the data points. For
                          # example, if a series has three data points, their indices will always
                          # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                          # what data points they are associated with.
                      &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                          # the subtotal will be computed and appear after the data point.
                      &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                    },
                  ],
                  &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                      # a subtotal column will appear at the end of each series. Setting this
                      # field to true will hide that subtotal column for this series.
                  &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                  &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                    &quot;colorStyle&quot;: { # A color value. # The color of the column.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                  },
                  &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                    &quot;colorStyle&quot;: { # A color value. # The color of the column.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                  },
                  &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                    &quot;colorStyle&quot;: { # A color value. # The color of the column.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                  },
                },
              ],
              &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
            },
            &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                # Strikethrough and underline are not supported.
                # Absent values indicate that the field isn&#x27;t specified.
              &quot;fontSize&quot;: 42, # The size of the font.
              &quot;underline&quot;: True or False, # True if the text is underlined.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                  # If foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;bold&quot;: True or False, # True if the text is bold.
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;italic&quot;: True or False, # True if the text is italicized.
              &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
            },
            &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                # Org charts require a unique set of labels in labels and may
                # optionally include parent_labels and tooltips.
                # parent_labels contain, for each node, the label identifying the parent
                # node.  tooltips contain, for each node, an optional tooltip.
                #
                # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
              &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                  # A blank value indicates that the node has no parent and is a top-level
                  # node.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                  # If selected_node_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                  # If node_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                  # results in no tooltip being displayed for the node.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
              &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                  # must be unique.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
            },
            &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
              &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
              &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
              &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
              &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
            },
            &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                # for accessibility.
            &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                # This field is optional.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
            },
            &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                # axis labels, legend).  If a font is specified for a specific part of the
                # chart it will override this font name.
            &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                # Strikethrough and underline are not supported.
                # Absent values indicate that the field isn&#x27;t specified.
              &quot;fontSize&quot;: 42, # The size of the font.
              &quot;underline&quot;: True or False, # True if the text is underlined.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                  # If foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;bold&quot;: True or False, # True if the text is bold.
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;italic&quot;: True or False, # True if the text is italicized.
              &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
              &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
            },
            &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                # minimum padding.  False to use the default padding.
                # (Not applicable to Geo and Org charts.)
            &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                # This field is optional.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
            },
            &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                # represent things like total sales, average cost, or a top selling item. You
                # can specify a single data value, or aggregate over a range of data.
                # Percentage or absolute difference from a baseline value can be highlighted,
                # like changes over time.
              &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                  # This field is optional.
              &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                  # This field is optional.
              &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                  # 10 can be used to divide all values in the chart by 10.
                  # This field is optional.
              &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                  # This field is needed only if baseline_value_data is specified.
                &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                    # This field is optional.
                &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                    # key value. This field is optional.
                    # If positive_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                    # key value. This field is optional.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                    # key value. This field is optional.
                    # If negative_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                    # This field is optional. If not specified, default positioning is used.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                },
                &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                    # key value. This field is optional.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                    # This field is optional. If not specified, default positioning is used.
                  &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                },
              },
              &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                  # chart. This field is used only when number_format_source is set to
                  # CUSTOM. This field is optional.
                &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                    # This field is optional.
                &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                    # This field is optional.
              },
            },
            &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                # Not applicable to Org charts.
                # If background_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
            &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
            &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
              &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                  # 0 is fully transparent and 1 is fully opaque.
              &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                  # the bubbles at different sizes relative to each other.
                  # If specified, group_ids must also be specified.  This field is
                  # optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                  # If specific, the field must be a positive value.
              &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                  # If specified, the field must be a positive value.
              &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                  # If bubble_border_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                  # ID are drawn in the same color. If bubble_sizes is specified then
                  # this field must also be specified but may contain blank values.
                  # This field is optional.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                  # in the chart vertically.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
              &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                  # in the chart horizontally.
                &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                  &quot;sources&quot;: [ # The ranges of data for a series or domain.
                      # Exactly one dimension must have a length of 1,
                      # and all sources in the list must have the same dimension
                      # with length 1.
                      # The domain (if it exists) &amp; all series must have the same number
                      # of source ranges. If using more than one source range, then the source
                      # range at a given offset must be in order and contiguous across the domain
                      # and series.
                      #
                      # For example, these are valid configurations:
                      #
                      #     domain sources: A1:A5
                      #     series1 sources: B1:B5
                      #     series2 sources: D6:D10
                      #
                      #     domain sources: A1:A5, C10:C12
                      #     series1 sources: B1:B5, D10:D12
                      #     series2 sources: C1:C5, E10:E12
                    { # A range on a sheet.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                  ],
                },
              },
              &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                  # Underline and Strikethrough are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
            },
          },
          &quot;chartId&quot;: 42, # The ID of the chart.
          &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
            &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
              &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                  # All indexes are zero-based.
                &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
              },
              &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
              &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                  # from the anchor cell.
              &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
            },
            &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                # is chosen for you. Used only when writing.
            &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                # is on its own sheet. Must be non-negative.
          },
        },
      ],
      &quot;protectedRanges&quot;: [ # The protected ranges in this sheet.
        { # A protected range.
          &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
              # Unprotected ranges are only supported on protected sheets.
            { # A range on a sheet.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          ],
          &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
              # protected area.
              # This field is read-only.
          &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
              # This field is read-only.
          &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
          &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
              # The range may be fully unbounded, in which case this is considered
              # a protected sheet.
              #
              # When writing, only one of range or named_range_id
              # may be set.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
              # Warning-based protection means that every user can edit data in the
              # protected range, except editing will prompt a warning asking the user
              # to confirm the edit.
              #
              # When writing: if this field is true, then editors is ignored.
              # Additionally, if this field is changed from true to false and the
              # `editors` field is not set (nor included in the field mask), then
              # the editors will be set to all the editors in the document.
          &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
              # This field is only visible to users with edit access to the protected
              # range and the document.
              # Editors are not supported with warning_only protection.
            &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
              &quot;A String&quot;,
            ],
            &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                # range.  Domain protection is only supported on documents within a domain.
            &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
              &quot;A String&quot;,
            ],
          },
          &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
              #
              # When writing, only one of range or named_range_id
              # may be set.
        },
      ],
      &quot;basicFilter&quot;: { # The default filter associated with a sheet. # The filter on this sheet, if any.
        &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
            # The map&#x27;s key is the column index, and the value is the criteria for
            # that column.
          &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
            &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                # shown. Mutually exclusive with visible_foreground_color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                # (This does not override hidden_values -- if a value is listed there,
                #  it will still be hidden.)
                # BooleanConditions are used by conditional formatting,
                # data validation, and the criteria in filters.
              &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                  # on the condition type.  Some support zero values,
                  # others one or two values,
                  # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                { # The value of the condition.
                  &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                      # Valid only if the type is
                      # DATE_BEFORE,
                      # DATE_AFTER,
                      # DATE_ON_OR_BEFORE or
                      # DATE_ON_OR_AFTER.
                      #
                      # Relative dates are not supported in data validation.
                      # They are supported only in conditional formatting and
                      # conditional filters.
                  &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                      # The value is parsed as if the user typed into a cell.
                      # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                },
              ],
              &quot;type&quot;: &quot;A String&quot;, # The type of condition.
            },
            &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                # are shown. Mutually exclusive with visible_background_color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                # shown. This field is mutually exclusive with visible_foreground_color,
                # and must be set to an RGB-type color. If visible_background_color is
                # also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                # are shown. This field is mutually exclusive with
                # visible_background_color, and must be set to an RGB-type color. If
                # visible_foreground_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;hiddenValues&quot;: [ # Values that should be hidden.
              &quot;A String&quot;,
            ],
          },
        },
        &quot;range&quot;: { # A range on a sheet. # The range the filter covers.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
          &quot;sheetId&quot;: 42, # The sheet this range is on.
          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
        },
        &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
            # are equal in the earlier specifications.
          { # A sort order associated with a specific column or row.
            &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                # to the top. Mutually exclusive with foreground_color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                # to the top. Mutually exclusive with foreground_color, and must be an
                # RGB-type color. If background_color is also set, this field takes
                # precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
            &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
            &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                # sorted to the top. Mutually exclusive with background_color, and must
                # be an RGB-type color. If foreground_color is also set, this field takes
                # precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                # sorted to the top. Mutually exclusive with background_color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
        ],
      },
      &quot;merges&quot;: [ # The ranges that are merged together.
        { # A range on a sheet.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
          &quot;sheetId&quot;: 42, # The sheet this range is on.
          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
        },
      ],
      &quot;bandedRanges&quot;: [ # The banded (alternating colors) ranges on this sheet.
        { # A banded (alternating colors) range in a sheet.
          &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
              # by-column basis throughout all the columns in the range. At least one of
              # row_properties or column_properties must be specified.
              # BandedRange.row_properties and BandedRange.column_properties are
              # set, the fill colors are applied to cells according to the following rules:
              #
              # * header_color and footer_color take priority over band colors.
              # * first_band_color takes priority over second_band_color.
              # * row_properties takes priority over column_properties.
              #
              # For example, the first row color takes priority over the first column
              # color, but the first column color takes priority over the second row color.
              # Similarly, the row header takes priority over the column header in the
              # top left cell, but the column header takes priority over the first row
              # color if the row header is not set.
            &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                # If first_band_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                # or column is filled with this color and the colors alternate between
                # first_band_color and second_band_color starting from the second
                # row or column. Otherwise, the first row or column is filled with
                # first_band_color and the colors proceed to alternate as they normally
                # would.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                # or column is filled with this color and the colors alternate between
                # first_band_color and second_band_color starting from the second
                # row or column. Otherwise, the first row or column is filled with
                # first_band_color and the colors proceed to alternate as they normally
                # would. If header_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                # If second_band_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                # row or column is filled with either first_band_color or
                # second_band_color, depending on the color of the previous row or
                # column.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                # row or column is filled with either first_band_color or
                # second_band_color, depending on the color of the previous row or
                # column.
                # If footer_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          },
          &quot;bandedRangeId&quot;: 42, # The id of the banded range.
          &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
              # basis throughout all the rows in the range. At least one of
              # row_properties or column_properties must be specified.
              # BandedRange.row_properties and BandedRange.column_properties are
              # set, the fill colors are applied to cells according to the following rules:
              #
              # * header_color and footer_color take priority over band colors.
              # * first_band_color takes priority over second_band_color.
              # * row_properties takes priority over column_properties.
              #
              # For example, the first row color takes priority over the first column
              # color, but the first column color takes priority over the second row color.
              # Similarly, the row header takes priority over the column header in the
              # top left cell, but the column header takes priority over the first row
              # color if the row header is not set.
            &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                # If first_band_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                # or column is filled with this color and the colors alternate between
                # first_band_color and second_band_color starting from the second
                # row or column. Otherwise, the first row or column is filled with
                # first_band_color and the colors proceed to alternate as they normally
                # would.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                # or column is filled with this color and the colors alternate between
                # first_band_color and second_band_color starting from the second
                # row or column. Otherwise, the first row or column is filled with
                # first_band_color and the colors proceed to alternate as they normally
                # would. If header_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                # If second_band_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                # row or column is filled with either first_band_color or
                # second_band_color, depending on the color of the previous row or
                # column.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                # row or column is filled with either first_band_color or
                # second_band_color, depending on the color of the previous row or
                # column.
                # If footer_color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          },
          &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        },
      ],
      &quot;properties&quot;: { # Properties of a sheet. # The properties of the sheet.
        &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
            # When adding or updating sheet properties, if this field
            # is excluded then the sheet is added or moved to the end
            # of the sheet list. When updating sheet indices or inserting
            # sheets, movement is considered in &quot;before the move&quot; indexes.
            # For example, if there were 3 sheets (S1, S2, S3) in order to
            # move S1 ahead of S2 the index would have to be set to 2. A sheet
            # index update request is ignored if the requested index is
            # identical to the sheets current index or if the requested new
            # index is equal to the current sheet index + 1.
        &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
        &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
            # (If the sheet is an object sheet, containing a chart or image, then
            # this field will be absent.)
            # When writing it is an error to set any grid properties on non-grid sheets.
          &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
          &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
          &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
          &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
          &quot;rowCount&quot;: 42, # The number of rows in the grid.
          &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
          &quot;columnCount&quot;: 42, # The number of columns in the grid.
        },
        &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
            # This field cannot be changed once set.
        &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        },
        &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
        &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
            # If tab_color is also set, this field takes precedence.
          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
        },
        &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
        &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
            # This field cannot be changed once set.
      },
      &quot;conditionalFormats&quot;: [ # The conditional format rules in this sheet.
        { # A rule describing a conditional format.
          &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
              # All the ranges must be on the same grid.
            { # A range on a sheet.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          ],
          &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
            &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                # the format is applied.
                # BooleanConditions are used by conditional formatting,
                # data validation, and the criteria in filters.
              &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                  # on the condition type.  Some support zero values,
                  # others one or two values,
                  # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                { # The value of the condition.
                  &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                      # Valid only if the type is
                      # DATE_BEFORE,
                      # DATE_AFTER,
                      # DATE_ON_OR_BEFORE or
                      # DATE_ON_OR_AFTER.
                      #
                      # Relative dates are not supported in data validation.
                      # They are supported only in conditional formatting and
                      # conditional filters.
                  &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                      # The value is parsed as if the user typed into a cell.
                      # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                },
              ],
              &quot;type&quot;: &quot;A String&quot;, # The type of condition.
            },
            &quot;format&quot;: { # The format of a cell. # The format to apply.
                # Conditional formatting can only apply a subset of formatting:
                # bold, italic,
                # strikethrough,
                # foreground color &amp;
                # background color.
              &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
              &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
              &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
              &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                    # the user&#x27;s locale will be used if necessary for the given type.
                    # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                    # more information about the supported patterns.
                &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                    # When writing, this field must be set.
              },
              &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
                &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                  &quot;width&quot;: 42, # The width of the border, in pixels.
                      # Deprecated; the width is determined by the &quot;style&quot; field.
                  &quot;colorStyle&quot;: { # A color value. # The color of the border.
                      # If color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                },
              },
              &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                    # Measured in degrees. Valid values are between -90 and 90. Positive
                    # angles are angled upwards, negative are angled downwards.
                    #
                    # Note: For LTR text direction positive angles are in the
                    # counterclockwise direction, whereas for RTL they are in the clockwise
                    # direction
                &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                    # characters is unchanged.
                    # For example:
                    #
                    #     | V |
                    #     | e |
                    #     | r |
                    #     | t |
                    #     | i |
                    #     | c |
                    #     | a |
                    #     | l |
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                  # When updating padding, every field must be specified.
                &quot;right&quot;: 42, # The right padding of the cell.
                &quot;bottom&quot;: 42, # The bottom padding of the cell.
                &quot;left&quot;: 42, # The left padding of the cell.
                &quot;top&quot;: 42, # The top padding of the cell.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          },
          &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
              # the interpolation points listed. The format of a cell will vary
              # based on its contents as compared to the values of the interpolation
              # points.
            &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                # These pin the gradient color scale according to the color,
                # type and value chosen.
              &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                  # Unused if type is MIN or
                  # MAX.
              &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
            },
            &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                # These pin the gradient color scale according to the color,
                # type and value chosen.
              &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                  # Unused if type is MIN or
                  # MAX.
              &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
            },
            &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                # These pin the gradient color scale according to the color,
                # type and value chosen.
              &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                  # Unused if type is MIN or
                  # MAX.
              &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                  # If color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
            },
          },
        },
      ],
      &quot;data&quot;: [ # Data in the grid, if this is a grid sheet.
          #
          # The number of GridData objects returned is dependent on the number of
          # ranges requested on this sheet. For example, if this is representing
          # `Sheet1`, and the spreadsheet was requested with ranges
          # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
          # startRow/startColumn of `0`,
          # while the second one will have `startRow 14` (zero-based row 15),
          # and `startColumn 3` (zero-based column D).
        { # Data in the grid, as well as metadata about the dimensions.
          &quot;columnMetadata&quot;: [ # Metadata about the requested columns in the grid, starting with the column
              # in start_column.
            { # Properties about a dimension.
              &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
              &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                  # This field is read-only.
              &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
              &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                { # Developer metadata associated with a location or object in a spreadsheet.
                    # Developer metadata may be used to associate arbitrary data with various
                    # parts of a spreadsheet and will remain associated at those locations as they
                    # move around and the spreadsheet is edited.  For example, if developer
                    # metadata is associated with row 5 and another row is then subsequently
                    # inserted above row 5, that original metadata will still be associated with
                    # the row it was first associated with (what is now row 6). If the associated
                    # object is deleted its metadata is deleted too.
                  &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                      # same key.  Developer metadata must always have a key specified.
                  &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                  &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                      # specified.
                  &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                      # specified when metadata is created, otherwise one will be randomly
                      # generated and assigned. Must be positive.
                  &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                    &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                    &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                    &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                    &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                        # a dimension. The specified DimensionRange must represent a single row
                        # or column; it cannot be unbounded or span multiple rows or columns.
                        # All indexes are zero-based.
                        # Indexes are half open: the start index is inclusive
                        # and the end index is exclusive.
                        # Missing indexes indicate the range is unbounded on that side.
                      &quot;sheetId&quot;: 42, # The sheet this span is on.
                      &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                      &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                      &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                    },
                  },
                },
              ],
            },
          ],
          &quot;rowData&quot;: [ # The data in the grid, one entry per row,
              # starting with the row in startRow.
              # The values in RowData will correspond to columns starting
              # at start_column.
            { # Data about each cell in a row.
              &quot;values&quot;: [ # The values in the row, one per column.
                { # Data about a specific cell.
                  &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                      # is computed dynamically based on its data, grouping, filters, values,
                      # etc. Only the top-left cell of the pivot table contains the pivot table
                      # definition. The other cells will contain the calculated values of the
                      # results of the pivot in their effective_value fields.
                    &quot;rows&quot;: [ # Each row grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                        &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                        &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group&#x27;s values.
                          &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                          &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group &amp; two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                              # this would correspond to using the &quot;Total&quot; of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                        },
                        &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                            # This is only valid for row groupings and is ignored by columns.
                            #
                            # By default, we minimize repitition of headings by not showing higher
                            # level headings where they are the same. For example, even though the
                            # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                            # it is redundant with previous rows. Setting repeat_headings to true
                            # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                            #
                            #     +--------------+
                            #     | Q1     | Jan |
                            #     |        | Feb |
                            #     |        | Mar |
                            #     +--------+-----+
                            #     | Q1 Total     |
                            #     +--------------+
                        &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                            &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          },
                        ],
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                            # in the source data column rather than breaking out each individual value.
                            # Only one PivotGroup with a group rule may be added for each column in
                            # the source data, though on any given column you may add both a
                            # PivotGroup that has a rule and a PivotGroup that does not.
                          &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                              # buckets of a constant size. All values from HistogramRule.start to
                              # HistogramRule.end are placed into groups of size
                              # HistogramRule.interval. In addition, all values below
                              # HistogramRule.start are placed in one group, and all values above
                              # HistogramRule.end are placed in another. Only
                              # HistogramRule.interval is required, though if HistogramRule.start
                              # and HistogramRule.end are both provided, HistogramRule.start must
                              # be less than HistogramRule.end. For example, a pivot table showing
                              # average purchase amount by age that has 50+ rows:
                              #
                              #     +-----+-------------------+
                              #     | Age | AVERAGE of Amount |
                              #     +-----+-------------------+
                              #     | 16  |            $27.13 |
                              #     | 17  |             $5.24 |
                              #     | 18  |            $20.15 |
                              #     ...
                              #     +-----+-------------------+
                              # could be turned into a pivot table that looks like the one below by
                              # applying a histogram group rule with a HistogramRule.start of 25,
                              # an HistogramRule.interval of 20, and an HistogramRule.end
                              # of 65.
                              #
                              #     +-------------+-------------------+
                              #     | Grouped Age | AVERAGE of Amount |
                              #     +-------------+-------------------+
                              #     | &lt; 25        |            $19.34 |
                              #     | 25-45       |            $31.43 |
                              #     | 45-65       |            $35.87 |
                              #     | &gt; 65        |            $27.55 |
                              #     +-------------+-------------------+
                              #     | Grand Total |            $29.12 |
                              #     +-------------+-------------------+
                            &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                # of constant size. Values below start are lumped into a single bucket.
                                # This field is optional.
                            &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                # of constant size. Values above end are lumped into a single bucket.
                                # This field is optional.
                            &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                          },
                          &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                              # buckets based on selected parts of their date or time values. For example,
                              # consider a pivot table showing sales transactions by date:
                              #
                              #     +----------+--------------+
                              #     | Date     | SUM of Sales |
                              #     +----------+--------------+
                              #     | 1/1/2017 |      $621.14 |
                              #     | 2/3/2017 |      $708.84 |
                              #     | 5/8/2017 |      $326.84 |
                              #     ...
                              #     +----------+--------------+
                              # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                              # results in the following pivot table.
                              #
                              #     +--------------+--------------+
                              #     | Grouped Date | SUM of Sales |
                              #     +--------------+--------------+
                              #     | 2017-Jan     |   $53,731.78 |
                              #     | 2017-Feb     |   $83,475.32 |
                              #     | 2017-Mar     |   $94,385.05 |
                              #     ...
                              #     +--------------+--------------+
                            &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                          },
                          &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                              # buckets with names of your choosing. For example, a pivot table that
                              # aggregates population by state:
                              #
                              #     +-------+-------------------+
                              #     | State | SUM of Population |
                              #     +-------+-------------------+
                              #     | AK    |               0.7 |
                              #     | AL    |               4.8 |
                              #     | AR    |               2.9 |
                              #     ...
                              #     +-------+-------------------+
                              # could be turned into a pivot table that aggregates population by time zone
                              # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                              # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                              # Note that a similar effect could be achieved by adding a time zone column
                              # to the source data and adjusting the pivot table.
                              #
                              #     +-----------+-------------------+
                              #     | Time Zone | SUM of Population |
                              #     +-----------+-------------------+
                              #     | Central   |             106.3 |
                              #     | Eastern   |             151.9 |
                              #     | Mountain  |              17.4 |
                              #     ...
                              #     +-----------+-------------------+
                            &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                # that map to each group name.
                              { # A group name and a list of items from the source data that should be placed
                                  # in the group with this name.
                                &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                    # item may be a string, number, or boolean. Items may appear in at most one
                                    # group within a given ManualRule. Items that do not appear in any
                                    # group will appear on their own.
                                  { # The kinds of value that a cell in a spreadsheet can have.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                ],
                                &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                    # ManualRule must have a unique group name.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                          },
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                            # example, in the following pivot table, the row label is `Region` (which
                            # could be renamed to `State`) and the column label is `Product` (which
                            # could be renamed `Item`). Pivot tables created before December 2017 do
                            # not have header labels. If you&#x27;d like to add header labels to an existing
                            # pivot table, please delete the existing pivot table and then create a new
                            # pivot table with same parameters.
                            #
                            #     +--------------+---------+-------+
                            #     | SUM of Units | Product |       |
                            #     | Region       | Pen     | Paper |
                            #     +--------------+---------+-------+
                            #     | New York     |     345 |    98 |
                            #     | Oregon       |     234 |   123 |
                            #     | Tennessee    |     531 |   415 |
                            #     +--------------+---------+-------+
                            #     | Grand Total  |    1110 |   636 |
                            #     +--------------+---------+-------+
                      },
                    ],
                    &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                        # All indexes are zero-based.
                        # Indexes are half open, e.g the start index is inclusive
                        # and the end index is exclusive -- [start_index, end_index).
                        # Missing indexes indicate the range is unbounded on that side.
                        #
                        # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                        #
                        #   `Sheet1!A1:A1 == sheet_id: 0,
                        #                   start_row_index: 0, end_row_index: 1,
                        #                   start_column_index: 0, end_column_index: 1`
                        #
                        #   `Sheet1!A3:B4 == sheet_id: 0,
                        #                   start_row_index: 2, end_row_index: 4,
                        #                   start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A:B == sheet_id: 0,
                        #                 start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1!A5:B == sheet_id: 0,
                        #                  start_row_index: 4,
                        #                  start_column_index: 0, end_column_index: 2`
                        #
                        #   `Sheet1 == sheet_id:0`
                        #
                        # The start index must always be less than or equal to the end index.
                        # If the start index equals the end index, then the range is empty.
                        # Empty ranges are typically not meaningful and are usually rendered in the
                        # UI as `#REF!`.
                      &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                      &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                      &quot;sheetId&quot;: 42, # The sheet this range is on.
                      &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                      &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                    },
                    &quot;values&quot;: [ # A list of values to include in the pivot table.
                      { # The definition of how a value in a pivot table should be calculated.
                        &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                            # the result of a calculation with another pivot value. For example, if
                            # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                            # pivot values are displayed as the percentage of the grand total. In
                            # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                            # pivot table.
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this value refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                            # with an `=` character.
                        &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                            # If formula is set, the only supported values are
                            # SUM and
                            # CUSTOM.
                            # If sourceColumnOffset is set, then `CUSTOM`
                            # is not supported.
                        &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                      },
                    ],
                    &quot;columns&quot;: [ # Each column grouping in the pivot table.
                      { # A single grouping (either row or column) in a pivot table.
                        &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                        &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                        &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                            # If not specified, sorting is alphabetical by this group&#x27;s values.
                          &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                              # grouping should be sorted by.
                          &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                              #
                              # For example, in a pivot table with one row group &amp; two column groups,
                              # the row group can list up to two values. The first value corresponds
                              # to a value within the first column group, and the second value
                              # corresponds to a value in the second column group.  If no values
                              # are listed, this would indicate that the row should be sorted according
                              # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                              # this would correspond to using the &quot;Total&quot; of that bucket.
                            { # The kinds of value that a cell in a spreadsheet can have.
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          ],
                        },
                        &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                            # This is only valid for row groupings and is ignored by columns.
                            #
                            # By default, we minimize repitition of headings by not showing higher
                            # level headings where they are the same. For example, even though the
                            # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                            # it is redundant with previous rows. Setting repeat_headings to true
                            # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                            #
                            #     +--------------+
                            #     | Q1     | Jan |
                            #     |        | Feb |
                            #     |        | Mar |
                            #     +--------+-----+
                            #     | Q1 Total     |
                            #     +--------------+
                        &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                          { # Metadata about a value in a pivot grouping.
                            &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                            &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                # (Note that formulaValue is not valid,
                                #  because the values will be calculated.)
                              &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                  # This field is read-only.
                                &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                    # (in the spreadsheet&#x27;s locale).
                                &quot;type&quot;: &quot;A String&quot;, # The type of error.
                              },
                              &quot;boolValue&quot;: True or False, # Represents a boolean value.
                              &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                  # Leading single quotes are not included. For example, if the user typed
                                  # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                  # `&quot;123&quot;`.
                              &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                              &quot;numberValue&quot;: 3.14, # Represents a double value.
                                  # Note: Dates, Times and DateTimes are represented as doubles in
                                  # &quot;serial number&quot; format.
                            },
                          },
                        ],
                        &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                            #
                            # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                            # means this group refers to column `C`, whereas the offset `1` would
                            # refer to column `D`.
                        &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                            # in the source data column rather than breaking out each individual value.
                            # Only one PivotGroup with a group rule may be added for each column in
                            # the source data, though on any given column you may add both a
                            # PivotGroup that has a rule and a PivotGroup that does not.
                          &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                              # buckets of a constant size. All values from HistogramRule.start to
                              # HistogramRule.end are placed into groups of size
                              # HistogramRule.interval. In addition, all values below
                              # HistogramRule.start are placed in one group, and all values above
                              # HistogramRule.end are placed in another. Only
                              # HistogramRule.interval is required, though if HistogramRule.start
                              # and HistogramRule.end are both provided, HistogramRule.start must
                              # be less than HistogramRule.end. For example, a pivot table showing
                              # average purchase amount by age that has 50+ rows:
                              #
                              #     +-----+-------------------+
                              #     | Age | AVERAGE of Amount |
                              #     +-----+-------------------+
                              #     | 16  |            $27.13 |
                              #     | 17  |             $5.24 |
                              #     | 18  |            $20.15 |
                              #     ...
                              #     +-----+-------------------+
                              # could be turned into a pivot table that looks like the one below by
                              # applying a histogram group rule with a HistogramRule.start of 25,
                              # an HistogramRule.interval of 20, and an HistogramRule.end
                              # of 65.
                              #
                              #     +-------------+-------------------+
                              #     | Grouped Age | AVERAGE of Amount |
                              #     +-------------+-------------------+
                              #     | &lt; 25        |            $19.34 |
                              #     | 25-45       |            $31.43 |
                              #     | 45-65       |            $35.87 |
                              #     | &gt; 65        |            $27.55 |
                              #     +-------------+-------------------+
                              #     | Grand Total |            $29.12 |
                              #     +-------------+-------------------+
                            &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                # of constant size. Values below start are lumped into a single bucket.
                                # This field is optional.
                            &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                # of constant size. Values above end are lumped into a single bucket.
                                # This field is optional.
                            &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                          },
                          &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                              # buckets based on selected parts of their date or time values. For example,
                              # consider a pivot table showing sales transactions by date:
                              #
                              #     +----------+--------------+
                              #     | Date     | SUM of Sales |
                              #     +----------+--------------+
                              #     | 1/1/2017 |      $621.14 |
                              #     | 2/3/2017 |      $708.84 |
                              #     | 5/8/2017 |      $326.84 |
                              #     ...
                              #     +----------+--------------+
                              # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                              # results in the following pivot table.
                              #
                              #     +--------------+--------------+
                              #     | Grouped Date | SUM of Sales |
                              #     +--------------+--------------+
                              #     | 2017-Jan     |   $53,731.78 |
                              #     | 2017-Feb     |   $83,475.32 |
                              #     | 2017-Mar     |   $94,385.05 |
                              #     ...
                              #     +--------------+--------------+
                            &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                          },
                          &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                              # buckets with names of your choosing. For example, a pivot table that
                              # aggregates population by state:
                              #
                              #     +-------+-------------------+
                              #     | State | SUM of Population |
                              #     +-------+-------------------+
                              #     | AK    |               0.7 |
                              #     | AL    |               4.8 |
                              #     | AR    |               2.9 |
                              #     ...
                              #     +-------+-------------------+
                              # could be turned into a pivot table that aggregates population by time zone
                              # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                              # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                              # Note that a similar effect could be achieved by adding a time zone column
                              # to the source data and adjusting the pivot table.
                              #
                              #     +-----------+-------------------+
                              #     | Time Zone | SUM of Population |
                              #     +-----------+-------------------+
                              #     | Central   |             106.3 |
                              #     | Eastern   |             151.9 |
                              #     | Mountain  |              17.4 |
                              #     ...
                              #     +-----------+-------------------+
                            &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                # that map to each group name.
                              { # A group name and a list of items from the source data that should be placed
                                  # in the group with this name.
                                &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                    # item may be a string, number, or boolean. Items may appear in at most one
                                    # group within a given ManualRule. Items that do not appear in any
                                    # group will appear on their own.
                                  { # The kinds of value that a cell in a spreadsheet can have.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                ],
                                &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                    # ManualRule must have a unique group name.
                                  &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                      # This field is read-only.
                                    &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                        # (in the spreadsheet&#x27;s locale).
                                    &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                  },
                                  &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                  &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                      # Leading single quotes are not included. For example, if the user typed
                                      # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                      # `&quot;123&quot;`.
                                  &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                  &quot;numberValue&quot;: 3.14, # Represents a double value.
                                      # Note: Dates, Times and DateTimes are represented as doubles in
                                      # &quot;serial number&quot; format.
                                },
                              },
                            ],
                          },
                        },
                        &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                            # example, in the following pivot table, the row label is `Region` (which
                            # could be renamed to `State`) and the column label is `Product` (which
                            # could be renamed `Item`). Pivot tables created before December 2017 do
                            # not have header labels. If you&#x27;d like to add header labels to an existing
                            # pivot table, please delete the existing pivot table and then create a new
                            # pivot table with same parameters.
                            #
                            #     +--------------+---------+-------+
                            #     | SUM of Units | Product |       |
                            #     | Region       | Pen     | Paper |
                            #     +--------------+---------+-------+
                            #     | New York     |     345 |    98 |
                            #     | Oregon       |     234 |   123 |
                            #     | Tennessee    |     531 |   415 |
                            #     +--------------+---------+-------+
                            #     | Grand Total  |    1110 |   636 |
                            #     +--------------+---------+-------+
                      },
                    ],
                    &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                        # or vertically (as rows).
                    &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                        #
                        # The filters are applied before aggregating data into the pivot table.
                        # The map&#x27;s key is the column offset of the source range that you want to
                        # filter, and the value is the criteria for that column.
                        #
                        # For example, if the source was `C10:E15`, a key of `0` will have the filter
                        # for column `C`, whereas the key `1` is for column `D`.
                      &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                        &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                          &quot;A String&quot;,
                        ],
                      },
                    },
                  },
                  &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                      # This is the value as it&#x27;s shown to the user.
                      # This field is read-only.
                  &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                      # on user entered strings, not formulas, bools, or numbers.
                      # Runs start at specific indexes in the text and continue until the next
                      # run. Properties of a run will continue unless explicitly changed
                      # in a subsequent run (and properties of the first run will continue
                      # the properties of the cell unless explicitly changed).
                      #
                      # When writing, the new runs will overwrite any prior runs.  When writing a
                      # new user_entered_value, previous runs are erased.
                    { # A run of a text format. The format of this run continues until the start
                        # index of the next run.
                        # When updating, all fields must be set.
                      &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;startIndex&quot;: 42, # The character index where this run starts.
                    },
                  ],
                  &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                      # the calculated value.  For cells with literals, this is
                      # the same as the user_entered_value.
                      # This field is read-only.
                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                          # (in the spreadsheet&#x27;s locale).
                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                    },
                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                        # `&quot;123&quot;`.
                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # &quot;serial number&quot; format.
                  },
                  &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                      # This includes the results of applying any conditional formatting and,
                      # if the cell contains a formula, the computed number format.
                      # If the effective format is the default format, effective format will
                      # not be written.
                      # This field is read-only.
                    &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                    &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                    &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                    &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                      &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user&#x27;s locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                          # more information about the supported patterns.
                      &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                          # When writing, this field must be set.
                    },
                    &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                      &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                    },
                    &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                      &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                          # Measured in degrees. Valid values are between -90 and 90. Positive
                          # angles are angled upwards, negative are angled downwards.
                          #
                          # Note: For LTR text direction positive angles are in the
                          # counterclockwise direction, whereas for RTL they are in the clockwise
                          # direction
                      &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                          # characters is unchanged.
                          # For example:
                          #
                          #     | V |
                          #     | e |
                          #     | r |
                          #     | t |
                          #     | i |
                          #     | c |
                          #     | a |
                          #     | l |
                    },
                    &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                        # If background_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      &quot;right&quot;: 42, # The right padding of the cell.
                      &quot;bottom&quot;: 42, # The bottom padding of the cell.
                      &quot;left&quot;: 42, # The left padding of the cell.
                      &quot;top&quot;: 42, # The top padding of the cell.
                    },
                    &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                  &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                      #
                      # When writing, the new format will be merged with the existing format.
                    &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                    &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                    &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                    &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                      &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                          # the user&#x27;s locale will be used if necessary for the given type.
                          # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                          # more information about the supported patterns.
                      &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                          # When writing, this field must be set.
                    },
                    &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                      &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                      &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                        &quot;width&quot;: 42, # The width of the border, in pixels.
                            # Deprecated; the width is determined by the &quot;style&quot; field.
                        &quot;colorStyle&quot;: { # A color value. # The color of the border.
                            # If color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                      },
                    },
                    &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                    &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                      &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                          # Measured in degrees. Valid values are between -90 and 90. Positive
                          # angles are angled upwards, negative are angled downwards.
                          #
                          # Note: For LTR text direction positive angles are in the
                          # counterclockwise direction, whereas for RTL they are in the clockwise
                          # direction
                      &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                          # characters is unchanged.
                          # For example:
                          #
                          #     | V |
                          #     | e |
                          #     | r |
                          #     | t |
                          #     | i |
                          #     | c |
                          #     | a |
                          #     | l |
                    },
                    &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                        # If background_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                        # When updating padding, every field must be specified.
                      &quot;right&quot;: 42, # The right padding of the cell.
                      &quot;bottom&quot;: 42, # The bottom padding of the cell.
                      &quot;left&quot;: 42, # The left padding of the cell.
                      &quot;top&quot;: 42, # The top padding of the cell.
                    },
                    &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                      # Note: Dates, Times and DateTimes are represented as doubles in
                      # serial number format.
                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                        # This field is read-only.
                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                          # (in the spreadsheet&#x27;s locale).
                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                    },
                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                        # Leading single quotes are not included. For example, if the user typed
                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                        # `&quot;123&quot;`.
                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # &quot;serial number&quot; format.
                  },
                  &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                      #
                      # When writing, the new data validation rule will overwrite any prior rule.
                    &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                        # If true, &quot;List&quot; conditions will show a dropdown.
                    &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                    &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                    &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                        # BooleanConditions are used by conditional formatting,
                        # data validation, and the criteria in filters.
                      &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                          # on the condition type.  Some support zero values,
                          # others one or two values,
                          # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                        { # The value of the condition.
                          &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                              # Valid only if the type is
                              # DATE_BEFORE,
                              # DATE_AFTER,
                              # DATE_ON_OR_BEFORE or
                              # DATE_ON_OR_AFTER.
                              #
                              # Relative dates are not supported in data validation.
                              # They are supported only in conditional formatting and
                              # conditional filters.
                          &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                              # The value is parsed as if the user typed into a cell.
                              # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                        },
                      ],
                      &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                    },
                  },
                  &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                      # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                      # in the userEnteredValue.formulaValue
                      # field.)
                },
              ],
            },
          ],
          &quot;rowMetadata&quot;: [ # Metadata about the requested rows in the grid, starting with the row
              # in start_row.
            { # Properties about a dimension.
              &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
              &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                  # This field is read-only.
              &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
              &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                { # Developer metadata associated with a location or object in a spreadsheet.
                    # Developer metadata may be used to associate arbitrary data with various
                    # parts of a spreadsheet and will remain associated at those locations as they
                    # move around and the spreadsheet is edited.  For example, if developer
                    # metadata is associated with row 5 and another row is then subsequently
                    # inserted above row 5, that original metadata will still be associated with
                    # the row it was first associated with (what is now row 6). If the associated
                    # object is deleted its metadata is deleted too.
                  &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                      # same key.  Developer metadata must always have a key specified.
                  &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                  &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                      # specified.
                  &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                      # specified when metadata is created, otherwise one will be randomly
                      # generated and assigned. Must be positive.
                  &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                    &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                    &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                    &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                    &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                        # a dimension. The specified DimensionRange must represent a single row
                        # or column; it cannot be unbounded or span multiple rows or columns.
                        # All indexes are zero-based.
                        # Indexes are half open: the start index is inclusive
                        # and the end index is exclusive.
                        # Missing indexes indicate the range is unbounded on that side.
                      &quot;sheetId&quot;: 42, # The sheet this span is on.
                      &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                      &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                      &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                    },
                  },
                },
              ],
            },
          ],
          &quot;startColumn&quot;: 42, # The first column this GridData refers to, zero-based.
          &quot;startRow&quot;: 42, # The first row this GridData refers to, zero-based.
        },
      ],
    },
  ],
  &quot;spreadsheetId&quot;: &quot;A String&quot;, # The ID of the spreadsheet.
      # This field is read-only.
  &quot;properties&quot;: { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
    &quot;title&quot;: &quot;A String&quot;, # The title of the spreadsheet.
    &quot;defaultFormat&quot;: { # The format of a cell. # The default format of all cells in the spreadsheet.
        # CellData.effectiveFormat will not be set if
        # the cell&#x27;s format is equal to this default format. This field is read-only.
      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
            # the user&#x27;s locale will be used if necessary for the given type.
            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
            # more information about the supported patterns.
        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
            # When writing, this field must be set.
      },
      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
          &quot;width&quot;: 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the &quot;style&quot; field.
          &quot;colorStyle&quot;: { # A color value. # The color of the border.
              # If color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
        },
        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
          &quot;width&quot;: 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the &quot;style&quot; field.
          &quot;colorStyle&quot;: { # A color value. # The color of the border.
              # If color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
        },
        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
          &quot;width&quot;: 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the &quot;style&quot; field.
          &quot;colorStyle&quot;: { # A color value. # The color of the border.
              # If color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
        },
        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
          &quot;width&quot;: 42, # The width of the border, in pixels.
              # Deprecated; the width is determined by the &quot;style&quot; field.
          &quot;colorStyle&quot;: { # A color value. # The color of the border.
              # If color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
        },
      },
      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
          # Absent values indicate that the field isn&#x27;t specified.
        &quot;fontSize&quot;: 42, # The size of the font.
        &quot;underline&quot;: True or False, # True if the text is underlined.
        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
            # If foreground_color is also set, this field takes precedence.
          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
        },
        &quot;bold&quot;: True or False, # True if the text is bold.
        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        },
        &quot;italic&quot;: True or False, # True if the text is italicized.
        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
      },
      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
            # Measured in degrees. Valid values are between -90 and 90. Positive
            # angles are angled upwards, negative are angled downwards.
            #
            # Note: For LTR text direction positive angles are in the
            # counterclockwise direction, whereas for RTL they are in the clockwise
            # direction
        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
            # characters is unchanged.
            # For example:
            #
            #     | V |
            #     | e |
            #     | r |
            #     | t |
            #     | i |
            #     | c |
            #     | a |
            #     | l |
      },
      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
          # If background_color is also set, this field takes precedence.
        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        },
      },
      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
          # When updating padding, every field must be specified.
        &quot;right&quot;: 42, # The right padding of the cell.
        &quot;bottom&quot;: 42, # The bottom padding of the cell.
        &quot;left&quot;: 42, # The left padding of the cell.
        &quot;top&quot;: 42, # The top padding of the cell.
      },
      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
          # for simplicity of conversion to/from color representations in various
          # languages over compactness; for example, the fields of this representation
          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
          # method in iOS; and, with just a little work, it can be easily formatted into
          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
          #
          # Note: this proto does not carry information about the absolute color space
          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
          # space.
          #
          # Example (Java):
          #
          #      import com.google.type.Color;
          #
          #      // ...
          #      public static java.awt.Color fromProto(Color protocolor) {
          #        float alpha = protocolor.hasAlpha()
          #            ? protocolor.getAlpha().getValue()
          #            : 1.0;
          #
          #        return new java.awt.Color(
          #            protocolor.getRed(),
          #            protocolor.getGreen(),
          #            protocolor.getBlue(),
          #            alpha);
          #      }
          #
          #      public static Color toProto(java.awt.Color color) {
          #        float red = (float) color.getRed();
          #        float green = (float) color.getGreen();
          #        float blue = (float) color.getBlue();
          #        float denominator = 255.0;
          #        Color.Builder resultBuilder =
          #            Color
          #                .newBuilder()
          #                .setRed(red / denominator)
          #                .setGreen(green / denominator)
          #                .setBlue(blue / denominator);
          #        int alpha = color.getAlpha();
          #        if (alpha != 255) {
          #          result.setAlpha(
          #              FloatValue
          #                  .newBuilder()
          #                  .setValue(((float) alpha) / denominator)
          #                  .build());
          #        }
          #        return resultBuilder.build();
          #      }
          #      // ...
          #
          # Example (iOS / Obj-C):
          #
          #      // ...
          #      static UIColor* fromProto(Color* protocolor) {
          #         float red = [protocolor red];
          #         float green = [protocolor green];
          #         float blue = [protocolor blue];
          #         FloatValue* alpha_wrapper = [protocolor alpha];
          #         float alpha = 1.0;
          #         if (alpha_wrapper != nil) {
          #           alpha = [alpha_wrapper value];
          #         }
          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
          #      }
          #
          #      static Color* toProto(UIColor* color) {
          #          CGFloat red, green, blue, alpha;
          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
          #            return nil;
          #          }
          #          Color* result = [[Color alloc] init];
          #          [result setRed:red];
          #          [result setGreen:green];
          #          [result setBlue:blue];
          #          if (alpha &lt;= 0.9999) {
          #            [result setAlpha:floatWrapperWithValue(alpha)];
          #          }
          #          [result autorelease];
          #          return result;
          #     }
          #     // ...
          #
          #  Example (JavaScript):
          #
          #     // ...
          #
          #     var protoToCssColor = function(rgb_color) {
          #        var redFrac = rgb_color.red || 0.0;
          #        var greenFrac = rgb_color.green || 0.0;
          #        var blueFrac = rgb_color.blue || 0.0;
          #        var red = Math.floor(redFrac * 255);
          #        var green = Math.floor(greenFrac * 255);
          #        var blue = Math.floor(blueFrac * 255);
          #
          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
          #           return rgbToCssColor_(red, green, blue);
          #        }
          #
          #        var alphaFrac = rgb_color.alpha.value || 0.0;
          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
          #     };
          #
          #     var rgbToCssColor_ = function(red, green, blue) {
          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
          #       var hexString = rgbNumber.toString(16);
          #       var missingZeros = 6 - hexString.length;
          #       var resultBuilder = [&#x27;#&#x27;];
          #       for (var i = 0; i &lt; missingZeros; i++) {
          #          resultBuilder.push(&#x27;0&#x27;);
          #       }
          #       resultBuilder.push(hexString);
          #       return resultBuilder.join(&#x27;&#x27;);
          #     };
          #
          #     // ...
        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
            # the final pixel color is defined by the equation:
            #
            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
            #
            # This means that a value of 1.0 corresponds to a solid color, whereas
            # a value of 0.0 corresponds to a completely transparent color. This
            # uses a wrapper message rather than a simple float scalar so that it is
            # possible to distinguish between a default value and the value being unset.
            # If omitted, this color object is to be rendered as a solid color
            # (as if the alpha value had been explicitly given with a value of 1.0).
        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
      },
    },
    &quot;autoRecalc&quot;: &quot;A String&quot;, # The amount of time to wait before volatile functions are recalculated.
    &quot;iterativeCalculationSettings&quot;: { # Settings to control how circular dependencies are resolved with iterative # Determines whether and how circular references are resolved with iterative
        # calculation.  Absence of this field means that circular references result
        # in calculation errors.
        # calculation.
      &quot;maxIterations&quot;: 42, # When iterative calculation is enabled, the maximum number of calculation
          # rounds to perform.
      &quot;convergenceThreshold&quot;: 3.14, # When iterative calculation is enabled and successive results differ by
          # less than this threshold value, the calculation rounds stop.
    },
    &quot;timeZone&quot;: &quot;A String&quot;, # The time zone of the spreadsheet, in CLDR format such as
        # `America/New_York`. If the time zone isn&#x27;t recognized, this may
        # be a custom time zone such as `GMT-07:00`.
    &quot;spreadsheetTheme&quot;: { # Represents spreadsheet theme # Theme applied to the spreadsheet.
      &quot;primaryFontFamily&quot;: &quot;A String&quot;, # / Name of the primary font family.
      &quot;themeColors&quot;: [ # The spreadsheet theme color pairs. To update you must provide all theme
          # color pairs.
        { # A pair mapping a spreadsheet theme color type to the concrete color it
            # represents.
          &quot;colorType&quot;: &quot;A String&quot;, # The type of the spreadsheet theme color.
          &quot;color&quot;: { # A color value. # The concrete color corresponding to the theme color type.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
        },
      ],
    },
    &quot;locale&quot;: &quot;A String&quot;, # The locale of the spreadsheet in one of the following formats:
        #
        # * an ISO 639-1 language code such as `en`
        #
        # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
        #
        # * a combination of the ISO language code and country code, such as `en_US`
        #
        # Note: when updating this field, not all locales/languages are supported.
  },
  &quot;namedRanges&quot;: [ # The named ranges defined in a spreadsheet.
    { # A named range.
      &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
      &quot;range&quot;: { # A range on a sheet. # The range this represents.
          # All indexes are zero-based.
          # Indexes are half open, e.g the start index is inclusive
          # and the end index is exclusive -- [start_index, end_index).
          # Missing indexes indicate the range is unbounded on that side.
          #
          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
          #
          #   `Sheet1!A1:A1 == sheet_id: 0,
          #                   start_row_index: 0, end_row_index: 1,
          #                   start_column_index: 0, end_column_index: 1`
          #
          #   `Sheet1!A3:B4 == sheet_id: 0,
          #                   start_row_index: 2, end_row_index: 4,
          #                   start_column_index: 0, end_column_index: 2`
          #
          #   `Sheet1!A:B == sheet_id: 0,
          #                 start_column_index: 0, end_column_index: 2`
          #
          #   `Sheet1!A5:B == sheet_id: 0,
          #                  start_row_index: 4,
          #                  start_column_index: 0, end_column_index: 2`
          #
          #   `Sheet1 == sheet_id:0`
          #
          # The start index must always be less than or equal to the end index.
          # If the start index equals the end index, then the range is empty.
          # Empty ranges are typically not meaningful and are usually rendered in the
          # UI as `#REF!`.
        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
        &quot;sheetId&quot;: 42, # The sheet this range is on.
        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
      },
      &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
    },
  ],
  &quot;developerMetadata&quot;: [ # The developer metadata associated with a spreadsheet.
    { # Developer metadata associated with a location or object in a spreadsheet.
        # Developer metadata may be used to associate arbitrary data with various
        # parts of a spreadsheet and will remain associated at those locations as they
        # move around and the spreadsheet is edited.  For example, if developer
        # metadata is associated with row 5 and another row is then subsequently
        # inserted above row 5, that original metadata will still be associated with
        # the row it was first associated with (what is now row 6). If the associated
        # object is deleted its metadata is deleted too.
      &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
          # same key.  Developer metadata must always have a key specified.
      &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
      &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
          # specified.
      &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
          # specified when metadata is created, otherwise one will be randomly
          # generated and assigned. Must be positive.
      &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
        &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
        &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
        &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
        &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
            # a dimension. The specified DimensionRange must represent a single row
            # or column; it cannot be unbounded or span multiple rows or columns.
            # All indexes are zero-based.
            # Indexes are half open: the start index is inclusive
            # and the end index is exclusive.
            # Missing indexes indicate the range is unbounded on that side.
          &quot;sheetId&quot;: 42, # The sheet this span is on.
          &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
          &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
          &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
        },
      },
    },
  ],
}

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Resource that represents a spreadsheet.
    &quot;spreadsheetUrl&quot;: &quot;A String&quot;, # The url of the spreadsheet.
        # This field is read-only.
    &quot;sheets&quot;: [ # The sheets that are part of a spreadsheet.
      { # A sheet in a spreadsheet.
        &quot;rowGroups&quot;: [ # All row groups on this sheet, ordered by increasing range start index, then
            # by group depth.
          { # A group over an interval of rows or columns on a sheet, which can contain or
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        ],
        &quot;columnGroups&quot;: [ # All column groups on this sheet, ordered by increasing range start index,
            # then by group depth.
          { # A group over an interval of rows or columns on a sheet, which can contain or
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        ],
        &quot;slicers&quot;: [ # The slicers on this sheet.
          { # A slicer in a sheet.
            &quot;slicerId&quot;: 42, # The ID of the slicer.
            &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
              &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                  # If not set, default to `True`.
              &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                  # If unspecified, defaults to `LEFT`
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
                # existing sheet. Also, width and height of slicer can be automatically
                # adjusted to keep it within permitted limits.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        ],
        &quot;developerMetadata&quot;: [ # The developer metadata associated with a sheet.
          { # Developer metadata associated with a location or object in a spreadsheet.
              # Developer metadata may be used to associate arbitrary data with various
              # parts of a spreadsheet and will remain associated at those locations as they
              # move around and the spreadsheet is edited.  For example, if developer
              # metadata is associated with row 5 and another row is then subsequently
              # inserted above row 5, that original metadata will still be associated with
              # the row it was first associated with (what is now row 6). If the associated
              # object is deleted its metadata is deleted too.
            &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                # same key.  Developer metadata must always have a key specified.
            &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
            &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                # specified.
            &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                # specified when metadata is created, otherwise one will be randomly
                # generated and assigned. Must be positive.
            &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
              &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
              &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
              &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
              &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                  # a dimension. The specified DimensionRange must represent a single row
                  # or column; it cannot be unbounded or span multiple rows or columns.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          },
        ],
        &quot;filterViews&quot;: [ # The filter views in this sheet.
          { # A filter view.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
        ],
        &quot;charts&quot;: [ # The specifications of every chart on this sheet.
          { # A chart embedded in a sheet.
            &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
              &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                  # chart&lt;/a&gt;.
                &quot;data&quot;: [ # The Candlestick chart data.
                    # Only one CandlestickData is supported.
                  { # The Candlestick chart data, each containing the low, open, close, and high
                      # values for a series.
                    &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                        # candle. This is the bottom of the candle body.  If less than the close
                        # value the candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                        # candle. This is the top of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                        # This is the top of the candle body.  If greater than the open value the
                        # candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                        # This is the bottom of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                  },
                ],
                &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                    # will be treated as discrete labels, other data will be treated as
                    # continuous values.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              },
              &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                  # A histogram chart groups data items into bins, displaying each bin as a
                  # column of stacked items.  Histograms are used to display the distribution
                  # of a dataset.  Each column of items represents a range into which those
                  # items fall.  The number of bins can be chosen automatically or specified
                  # explicitly.
                &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                    # column.
                &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                    # bucketed or multiple series, each of the same length, containing the name
                    # of the series followed by the values to be bucketed for that series.
                  { # A histogram series containing the series color and data.
                    &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # If bar_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                    # column) is chosen automatically, but it may be overridden here.
                    # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                    # Cannot be negative.
                    # This field is optional.
                &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                    # affect the calculation of bucket sizes.  For example, setting an outlier
                    # percentile of 0.05 indicates that the top and bottom 5% of values when
                    # calculating buckets.  The values are still included in the chart, they will
                    # be added to the first or last buckets instead of their own buckets.
                    # Must be between 0.0 and 0.5.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
                &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                    # on the treemap chart. These levels are not interactive and are shown
                    # without their labels. Defaults to 0 if not specified.
                &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                    # interactive and are shown with their labels. Defaults to 2 if not
                    # specified.
                &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                    # assigned colors based on their color values. These color values come from
                    # color_data, or from size_data if color_data is not specified.
                    # Cells with color values less than or equal to min_value will
                    # have minValueColor as their
                    # background color. Cells with color values greater than or equal to
                    # max_value will have
                    # maxValueColor as their background
                    # color. Cells with color values between min_value and max_value will
                    # have background colors on a gradient between
                    # minValueColor and
                    # maxValueColor, the midpoint of
                    # the gradient being midValueColor.
                    # Cells with missing or non-numeric color values will have
                    # noDataColor as their background
                    # color.
                  &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # If no_data_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # If min_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # If mid_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # If max_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                    # If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual minimum value from color_data, or the minimum value from
                    # size_data if color_data is not specified.
                &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual maximum value from color_data, or the maximum value from
                    # size_data if color_data is not specified.
                &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                    # This field is optional. If not specified, size_data is used to
                    # determine background colors. If specified, the data is expected to be
                    # numeric. color_scale will determine how the values in this data map to
                    # data cell background colors.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                    # expected to be numeric. The cells corresponding to non-numeric or missing
                    # data will not be rendered. If color_data is not specified, this data
                    # is used to determine data cell background colors as well.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                &quot;series&quot;: [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                    &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                        # chartType is AREA,
                        # LINE, or SCATTER.
                        # COMBO charts are also supported if the
                        # series chart type is
                        # AREA or LINE.
                      &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                      &quot;width&quot;: 42, # The thickness of the line, in px.
                    },
                    &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the &quot;Volume&quot; series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn&#x27;t a valid minor axis
                        # for the chart&#x27;s type.
                    &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                    # Applies to Bar and Column charts.
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                    # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
                &quot;domains&quot;: [ # The domain of data this is charting.
                    # Only a single domain is supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  },
                ],
                &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                    # Applies to Line charts.
                &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                    # chart area.
                &quot;axis&quot;: [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                    &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                    &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                    &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                        # values in an axis).
                      &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                          # automatically determine a minimum value that looks good for the data.
                      &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                      &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                          # automatically determine a maximum value that looks good for the data.
                    },
                  },
                ],
                &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
                &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                    # segments of lines in a line chart will be missing).  To eliminate these
                    # gaps set this to true.
                    # Applies to Line, Area, and Combo charts.
              },
              &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
              &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
                &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
                &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
                &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                  &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                  &quot;width&quot;: 42, # The thickness of the line, in px.
                },
                &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                  { # A single series of data for a waterfall chart.
                    &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                        # subtotals are defined is not significant. Only one subtotal may be
                        # defined for each data point.
                      { # A custom subtotal column for a waterfall chart series.
                        &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                            # data_is_subtotal is true, the data point at this index is the
                            # subtotal. Otherwise, the subtotal appears after the data point with
                            # this index. A series can have multiple subtotals at arbitrary indices,
                            # but subtotals do not affect the indices of the data points. For
                            # example, if a series has three data points, their indices will always
                            # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                            # what data points they are associated with.
                        &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                            # the subtotal will be computed and appear after the data point.
                        &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                      },
                    ],
                    &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                        # a subtotal column will appear at the end of each series. Setting this
                        # field to true will hide that subtotal column for this series.
                    &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                  },
                ],
                &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
              },
              &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                  # Org charts require a unique set of labels in labels and may
                  # optionally include parent_labels and tooltips.
                  # parent_labels contain, for each node, the label identifying the parent
                  # node.  tooltips contain, for each node, an optional tooltip.
                  #
                  # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                  # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                  # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                  # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                  # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                    # A blank value indicates that the node has no parent and is a top-level
                    # node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                    # If selected_node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                    # If node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                    # results in no tooltip being displayed for the node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
                &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                    # must be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
                &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
                &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
                &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                  # for accessibility.
              &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                  # axis labels, legend).  If a font is specified for a specific part of the
                  # chart it will override this font name.
              &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                  # minimum padding.  False to use the default padding.
                  # (Not applicable to Geo and Org charts.)
              &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                  # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                  # represent things like total sales, average cost, or a top selling item. You
                  # can specify a single data value, or aggregate over a range of data.
                  # Percentage or absolute difference from a baseline value can be highlighted,
                  # like changes over time.
                &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                    # This field is optional.
                &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                    # This field is optional.
                &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                    # 10 can be used to divide all values in the chart by 10.
                    # This field is optional.
                &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                    # This field is needed only if baseline_value_data is specified.
                  &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                      # This field is optional.
                  &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # If positive_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # If negative_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                },
                &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                    # chart. This field is used only when number_format_source is set to
                    # CUSTOM. This field is optional.
                  &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                      # This field is optional.
                  &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                      # This field is optional.
                },
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
              &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
              &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
                &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                    # 0 is fully transparent and 1 is fully opaque.
                &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                    # the bubbles at different sizes relative to each other.
                    # If specified, group_ids must also be specified.  This field is
                    # optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                    # If specific, the field must be a positive value.
                &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                    # If specified, the field must be a positive value.
                &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                    # If bubble_border_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                    # ID are drawn in the same color. If bubble_sizes is specified then
                    # this field must also be specified but may contain blank values.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                    # in the chart vertically.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
                &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                    # in the chart horizontally.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                    # Underline and Strikethrough are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
              },
            },
            &quot;chartId&quot;: 42, # The ID of the chart.
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        ],
        &quot;protectedRanges&quot;: [ # The protected ranges in this sheet.
          { # A protected range.
            &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                # This field is read-only.
            &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
            &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                &quot;A String&quot;,
              ],
              &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                &quot;A String&quot;,
              ],
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
          },
        ],
        &quot;basicFilter&quot;: { # The default filter associated with a sheet. # The filter on this sheet, if any.
          &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
              # The map&#x27;s key is the column index, and the value is the criteria for
              # that column.
            &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
              &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                  # shown. Mutually exclusive with visible_foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hidden_values -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                  # are shown. Mutually exclusive with visible_background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                  # shown. This field is mutually exclusive with visible_foreground_color,
                  # and must be set to an RGB-type color. If visible_background_color is
                  # also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                  # are shown. This field is mutually exclusive with
                  # visible_background_color, and must be set to an RGB-type color. If
                  # visible_foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;hiddenValues&quot;: [ # Values that should be hidden.
                &quot;A String&quot;,
              ],
            },
          },
          &quot;range&quot;: { # A range on a sheet. # The range the filter covers.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color, and must be an
                  # RGB-type color. If background_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
              &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color, and must
                  # be an RGB-type color. If foreground_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          ],
        },
        &quot;merges&quot;: [ # The ranges that are merged together.
          { # A range on a sheet.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        ],
        &quot;bandedRanges&quot;: [ # The banded (alternating colors) ranges on this sheet.
          { # A banded (alternating colors) range in a sheet.
            &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;bandedRangeId&quot;: 42, # The id of the banded range.
            &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          },
        ],
        &quot;properties&quot;: { # Properties of a sheet. # The properties of the sheet.
          &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
              # When adding or updating sheet properties, if this field
              # is excluded then the sheet is added or moved to the end
              # of the sheet list. When updating sheet indices or inserting
              # sheets, movement is considered in &quot;before the move&quot; indexes.
              # For example, if there were 3 sheets (S1, S2, S3) in order to
              # move S1 ahead of S2 the index would have to be set to 2. A sheet
              # index update request is ignored if the requested index is
              # identical to the sheets current index or if the requested new
              # index is equal to the current sheet index + 1.
          &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
          &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
              # (If the sheet is an object sheet, containing a chart or image, then
              # this field will be absent.)
              # When writing it is an error to set any grid properties on non-grid sheets.
            &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
            &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
            &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
            &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
            &quot;rowCount&quot;: 42, # The number of rows in the grid.
            &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
            &quot;columnCount&quot;: 42, # The number of columns in the grid.
          },
          &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
              # This field cannot be changed once set.
          &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
          &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
              # If tab_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
          &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
              # This field cannot be changed once set.
        },
        &quot;conditionalFormats&quot;: [ # The conditional format rules in this sheet.
          { # A rule describing a conditional format.
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        ],
        &quot;data&quot;: [ # Data in the grid, if this is a grid sheet.
            #
            # The number of GridData objects returned is dependent on the number of
            # ranges requested on this sheet. For example, if this is representing
            # `Sheet1`, and the spreadsheet was requested with ranges
            # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
            # startRow/startColumn of `0`,
            # while the second one will have `startRow 14` (zero-based row 15),
            # and `startColumn 3` (zero-based column D).
          { # Data in the grid, as well as metadata about the dimensions.
            &quot;columnMetadata&quot;: [ # Metadata about the requested columns in the grid, starting with the column
                # in start_column.
              { # Properties about a dimension.
                &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                    # This field is read-only.
                &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                  { # Developer metadata associated with a location or object in a spreadsheet.
                      # Developer metadata may be used to associate arbitrary data with various
                      # parts of a spreadsheet and will remain associated at those locations as they
                      # move around and the spreadsheet is edited.  For example, if developer
                      # metadata is associated with row 5 and another row is then subsequently
                      # inserted above row 5, that original metadata will still be associated with
                      # the row it was first associated with (what is now row 6). If the associated
                      # object is deleted its metadata is deleted too.
                    &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                        # same key.  Developer metadata must always have a key specified.
                    &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                    &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                        # specified.
                    &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                        # specified when metadata is created, otherwise one will be randomly
                        # generated and assigned. Must be positive.
                    &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                      &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                      &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                      &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                      &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                          # a dimension. The specified DimensionRange must represent a single row
                          # or column; it cannot be unbounded or span multiple rows or columns.
                          # All indexes are zero-based.
                          # Indexes are half open: the start index is inclusive
                          # and the end index is exclusive.
                          # Missing indexes indicate the range is unbounded on that side.
                        &quot;sheetId&quot;: 42, # The sheet this span is on.
                        &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                        &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                        &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                      },
                    },
                  },
                ],
              },
            ],
            &quot;rowData&quot;: [ # The data in the grid, one entry per row,
                # starting with the row in startRow.
                # The values in RowData will correspond to columns starting
                # at start_column.
              { # Data about each cell in a row.
                &quot;values&quot;: [ # The values in the row, one per column.
                  { # Data about a specific cell.
                    &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                        # is computed dynamically based on its data, grouping, filters, values,
                        # etc. Only the top-left cell of the pivot table contains the pivot table
                        # definition. The other cells will contain the calculated values of the
                        # results of the pivot in their effective_value fields.
                      &quot;rows&quot;: [ # Each row grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                          &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                          &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group&#x27;s values.
                            &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                            &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group &amp; two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                # this would correspond to using the &quot;Total&quot; of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            ],
                          },
                          &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                              # This is only valid for row groupings and is ignored by columns.
                              #
                              # By default, we minimize repitition of headings by not showing higher
                              # level headings where they are the same. For example, even though the
                              # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                              # it is redundant with previous rows. Setting repeat_headings to true
                              # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                              #
                              #     +--------------+
                              #     | Q1     | Jan |
                              #     |        | Feb |
                              #     |        | Mar |
                              #     +--------+-----+
                              #     | Q1 Total     |
                              #     +--------------+
                          &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                              &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            },
                          ],
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                              # in the source data column rather than breaking out each individual value.
                              # Only one PivotGroup with a group rule may be added for each column in
                              # the source data, though on any given column you may add both a
                              # PivotGroup that has a rule and a PivotGroup that does not.
                            &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                # buckets of a constant size. All values from HistogramRule.start to
                                # HistogramRule.end are placed into groups of size
                                # HistogramRule.interval. In addition, all values below
                                # HistogramRule.start are placed in one group, and all values above
                                # HistogramRule.end are placed in another. Only
                                # HistogramRule.interval is required, though if HistogramRule.start
                                # and HistogramRule.end are both provided, HistogramRule.start must
                                # be less than HistogramRule.end. For example, a pivot table showing
                                # average purchase amount by age that has 50+ rows:
                                #
                                #     +-----+-------------------+
                                #     | Age | AVERAGE of Amount |
                                #     +-----+-------------------+
                                #     | 16  |            $27.13 |
                                #     | 17  |             $5.24 |
                                #     | 18  |            $20.15 |
                                #     ...
                                #     +-----+-------------------+
                                # could be turned into a pivot table that looks like the one below by
                                # applying a histogram group rule with a HistogramRule.start of 25,
                                # an HistogramRule.interval of 20, and an HistogramRule.end
                                # of 65.
                                #
                                #     +-------------+-------------------+
                                #     | Grouped Age | AVERAGE of Amount |
                                #     +-------------+-------------------+
                                #     | &lt; 25        |            $19.34 |
                                #     | 25-45       |            $31.43 |
                                #     | 45-65       |            $35.87 |
                                #     | &gt; 65        |            $27.55 |
                                #     +-------------+-------------------+
                                #     | Grand Total |            $29.12 |
                                #     +-------------+-------------------+
                              &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                  # of constant size. Values below start are lumped into a single bucket.
                                  # This field is optional.
                              &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                  # of constant size. Values above end are lumped into a single bucket.
                                  # This field is optional.
                              &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                            },
                            &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                # buckets based on selected parts of their date or time values. For example,
                                # consider a pivot table showing sales transactions by date:
                                #
                                #     +----------+--------------+
                                #     | Date     | SUM of Sales |
                                #     +----------+--------------+
                                #     | 1/1/2017 |      $621.14 |
                                #     | 2/3/2017 |      $708.84 |
                                #     | 5/8/2017 |      $326.84 |
                                #     ...
                                #     +----------+--------------+
                                # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                # results in the following pivot table.
                                #
                                #     +--------------+--------------+
                                #     | Grouped Date | SUM of Sales |
                                #     +--------------+--------------+
                                #     | 2017-Jan     |   $53,731.78 |
                                #     | 2017-Feb     |   $83,475.32 |
                                #     | 2017-Mar     |   $94,385.05 |
                                #     ...
                                #     +--------------+--------------+
                              &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                            },
                            &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                # buckets with names of your choosing. For example, a pivot table that
                                # aggregates population by state:
                                #
                                #     +-------+-------------------+
                                #     | State | SUM of Population |
                                #     +-------+-------------------+
                                #     | AK    |               0.7 |
                                #     | AL    |               4.8 |
                                #     | AR    |               2.9 |
                                #     ...
                                #     +-------+-------------------+
                                # could be turned into a pivot table that aggregates population by time zone
                                # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                # Note that a similar effect could be achieved by adding a time zone column
                                # to the source data and adjusting the pivot table.
                                #
                                #     +-----------+-------------------+
                                #     | Time Zone | SUM of Population |
                                #     +-----------+-------------------+
                                #     | Central   |             106.3 |
                                #     | Eastern   |             151.9 |
                                #     | Mountain  |              17.4 |
                                #     ...
                                #     +-----------+-------------------+
                              &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                  # that map to each group name.
                                { # A group name and a list of items from the source data that should be placed
                                    # in the group with this name.
                                  &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                      # item may be a string, number, or boolean. Items may appear in at most one
                                      # group within a given ManualRule. Items that do not appear in any
                                      # group will appear on their own.
                                    { # The kinds of value that a cell in a spreadsheet can have.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  ],
                                  &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                      # ManualRule must have a unique group name.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                },
                              ],
                            },
                          },
                          &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                              # example, in the following pivot table, the row label is `Region` (which
                              # could be renamed to `State`) and the column label is `Product` (which
                              # could be renamed `Item`). Pivot tables created before December 2017 do
                              # not have header labels. If you&#x27;d like to add header labels to an existing
                              # pivot table, please delete the existing pivot table and then create a new
                              # pivot table with same parameters.
                              #
                              #     +--------------+---------+-------+
                              #     | SUM of Units | Product |       |
                              #     | Region       | Pen     | Paper |
                              #     +--------------+---------+-------+
                              #     | New York     |     345 |    98 |
                              #     | Oregon       |     234 |   123 |
                              #     | Tennessee    |     531 |   415 |
                              #     +--------------+---------+-------+
                              #     | Grand Total  |    1110 |   636 |
                              #     +--------------+---------+-------+
                        },
                      ],
                      &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                      &quot;values&quot;: [ # A list of values to include in the pivot table.
                        { # The definition of how a value in a pivot table should be calculated.
                          &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                              # the result of a calculation with another pivot value. For example, if
                              # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                              # pivot values are displayed as the percentage of the grand total. In
                              # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                              # pivot table.
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this value refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                              # with an `=` character.
                          &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                              # If formula is set, the only supported values are
                              # SUM and
                              # CUSTOM.
                              # If sourceColumnOffset is set, then `CUSTOM`
                              # is not supported.
                          &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                        },
                      ],
                      &quot;columns&quot;: [ # Each column grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                          &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                          &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group&#x27;s values.
                            &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                            &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group &amp; two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                # this would correspond to using the &quot;Total&quot; of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            ],
                          },
                          &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                              # This is only valid for row groupings and is ignored by columns.
                              #
                              # By default, we minimize repitition of headings by not showing higher
                              # level headings where they are the same. For example, even though the
                              # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                              # it is redundant with previous rows. Setting repeat_headings to true
                              # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                              #
                              #     +--------------+
                              #     | Q1     | Jan |
                              #     |        | Feb |
                              #     |        | Mar |
                              #     +--------+-----+
                              #     | Q1 Total     |
                              #     +--------------+
                          &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                              &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            },
                          ],
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                              # in the source data column rather than breaking out each individual value.
                              # Only one PivotGroup with a group rule may be added for each column in
                              # the source data, though on any given column you may add both a
                              # PivotGroup that has a rule and a PivotGroup that does not.
                            &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                # buckets of a constant size. All values from HistogramRule.start to
                                # HistogramRule.end are placed into groups of size
                                # HistogramRule.interval. In addition, all values below
                                # HistogramRule.start are placed in one group, and all values above
                                # HistogramRule.end are placed in another. Only
                                # HistogramRule.interval is required, though if HistogramRule.start
                                # and HistogramRule.end are both provided, HistogramRule.start must
                                # be less than HistogramRule.end. For example, a pivot table showing
                                # average purchase amount by age that has 50+ rows:
                                #
                                #     +-----+-------------------+
                                #     | Age | AVERAGE of Amount |
                                #     +-----+-------------------+
                                #     | 16  |            $27.13 |
                                #     | 17  |             $5.24 |
                                #     | 18  |            $20.15 |
                                #     ...
                                #     +-----+-------------------+
                                # could be turned into a pivot table that looks like the one below by
                                # applying a histogram group rule with a HistogramRule.start of 25,
                                # an HistogramRule.interval of 20, and an HistogramRule.end
                                # of 65.
                                #
                                #     +-------------+-------------------+
                                #     | Grouped Age | AVERAGE of Amount |
                                #     +-------------+-------------------+
                                #     | &lt; 25        |            $19.34 |
                                #     | 25-45       |            $31.43 |
                                #     | 45-65       |            $35.87 |
                                #     | &gt; 65        |            $27.55 |
                                #     +-------------+-------------------+
                                #     | Grand Total |            $29.12 |
                                #     +-------------+-------------------+
                              &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                  # of constant size. Values below start are lumped into a single bucket.
                                  # This field is optional.
                              &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                  # of constant size. Values above end are lumped into a single bucket.
                                  # This field is optional.
                              &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                            },
                            &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                # buckets based on selected parts of their date or time values. For example,
                                # consider a pivot table showing sales transactions by date:
                                #
                                #     +----------+--------------+
                                #     | Date     | SUM of Sales |
                                #     +----------+--------------+
                                #     | 1/1/2017 |      $621.14 |
                                #     | 2/3/2017 |      $708.84 |
                                #     | 5/8/2017 |      $326.84 |
                                #     ...
                                #     +----------+--------------+
                                # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                # results in the following pivot table.
                                #
                                #     +--------------+--------------+
                                #     | Grouped Date | SUM of Sales |
                                #     +--------------+--------------+
                                #     | 2017-Jan     |   $53,731.78 |
                                #     | 2017-Feb     |   $83,475.32 |
                                #     | 2017-Mar     |   $94,385.05 |
                                #     ...
                                #     +--------------+--------------+
                              &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                            },
                            &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                # buckets with names of your choosing. For example, a pivot table that
                                # aggregates population by state:
                                #
                                #     +-------+-------------------+
                                #     | State | SUM of Population |
                                #     +-------+-------------------+
                                #     | AK    |               0.7 |
                                #     | AL    |               4.8 |
                                #     | AR    |               2.9 |
                                #     ...
                                #     +-------+-------------------+
                                # could be turned into a pivot table that aggregates population by time zone
                                # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                # Note that a similar effect could be achieved by adding a time zone column
                                # to the source data and adjusting the pivot table.
                                #
                                #     +-----------+-------------------+
                                #     | Time Zone | SUM of Population |
                                #     +-----------+-------------------+
                                #     | Central   |             106.3 |
                                #     | Eastern   |             151.9 |
                                #     | Mountain  |              17.4 |
                                #     ...
                                #     +-----------+-------------------+
                              &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                  # that map to each group name.
                                { # A group name and a list of items from the source data that should be placed
                                    # in the group with this name.
                                  &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                      # item may be a string, number, or boolean. Items may appear in at most one
                                      # group within a given ManualRule. Items that do not appear in any
                                      # group will appear on their own.
                                    { # The kinds of value that a cell in a spreadsheet can have.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  ],
                                  &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                      # ManualRule must have a unique group name.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                },
                              ],
                            },
                          },
                          &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                              # example, in the following pivot table, the row label is `Region` (which
                              # could be renamed to `State`) and the column label is `Product` (which
                              # could be renamed `Item`). Pivot tables created before December 2017 do
                              # not have header labels. If you&#x27;d like to add header labels to an existing
                              # pivot table, please delete the existing pivot table and then create a new
                              # pivot table with same parameters.
                              #
                              #     +--------------+---------+-------+
                              #     | SUM of Units | Product |       |
                              #     | Region       | Pen     | Paper |
                              #     +--------------+---------+-------+
                              #     | New York     |     345 |    98 |
                              #     | Oregon       |     234 |   123 |
                              #     | Tennessee    |     531 |   415 |
                              #     +--------------+---------+-------+
                              #     | Grand Total  |    1110 |   636 |
                              #     +--------------+---------+-------+
                        },
                      ],
                      &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                          # or vertically (as rows).
                      &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                          #
                          # The filters are applied before aggregating data into the pivot table.
                          # The map&#x27;s key is the column offset of the source range that you want to
                          # filter, and the value is the criteria for that column.
                          #
                          # For example, if the source was `C10:E15`, a key of `0` will have the filter
                          # for column `C`, whereas the key `1` is for column `D`.
                        &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                          &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                            &quot;A String&quot;,
                          ],
                        },
                      },
                    },
                    &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                        # This is the value as it&#x27;s shown to the user.
                        # This field is read-only.
                    &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                        # on user entered strings, not formulas, bools, or numbers.
                        # Runs start at specific indexes in the text and continue until the next
                        # run. Properties of a run will continue unless explicitly changed
                        # in a subsequent run (and properties of the first run will continue
                        # the properties of the cell unless explicitly changed).
                        #
                        # When writing, the new runs will overwrite any prior runs.  When writing a
                        # new user_entered_value, previous runs are erased.
                      { # A run of a text format. The format of this run continues until the start
                          # index of the next run.
                          # When updating, all fields must be set.
                        &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                            # Absent values indicate that the field isn&#x27;t specified.
                          &quot;fontSize&quot;: 42, # The size of the font.
                          &quot;underline&quot;: True or False, # True if the text is underlined.
                          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                              # If foreground_color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;bold&quot;: True or False, # True if the text is bold.
                          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;italic&quot;: True or False, # True if the text is italicized.
                          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                        },
                        &quot;startIndex&quot;: 42, # The character index where this run starts.
                      },
                    ],
                    &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                        # the calculated value.  For cells with literals, this is
                        # the same as the user_entered_value.
                        # This field is read-only.
                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                            # (in the spreadsheet&#x27;s locale).
                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                      },
                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                          # `&quot;123&quot;`.
                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # &quot;serial number&quot; format.
                    },
                    &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                        # This includes the results of applying any conditional formatting and,
                        # if the cell contains a formula, the computed number format.
                        # If the effective format is the default format, effective format will
                        # not be written.
                        # This field is read-only.
                      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user&#x27;s locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                            # more information about the supported patterns.
                        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                            # When writing, this field must be set.
                      },
                      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                      },
                      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                            # Measured in degrees. Valid values are between -90 and 90. Positive
                            # angles are angled upwards, negative are angled downwards.
                            #
                            # Note: For LTR text direction positive angles are in the
                            # counterclockwise direction, whereas for RTL they are in the clockwise
                            # direction
                        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                            # characters is unchanged.
                            # For example:
                            #
                            #     | V |
                            #     | e |
                            #     | r |
                            #     | t |
                            #     | i |
                            #     | c |
                            #     | a |
                            #     | l |
                      },
                      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                          # If background_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        &quot;right&quot;: 42, # The right padding of the cell.
                        &quot;bottom&quot;: 42, # The bottom padding of the cell.
                        &quot;left&quot;: 42, # The left padding of the cell.
                        &quot;top&quot;: 42, # The top padding of the cell.
                      },
                      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                    &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                        #
                        # When writing, the new format will be merged with the existing format.
                      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user&#x27;s locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                            # more information about the supported patterns.
                        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                            # When writing, this field must be set.
                      },
                      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                      },
                      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                            # Measured in degrees. Valid values are between -90 and 90. Positive
                            # angles are angled upwards, negative are angled downwards.
                            #
                            # Note: For LTR text direction positive angles are in the
                            # counterclockwise direction, whereas for RTL they are in the clockwise
                            # direction
                        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                            # characters is unchanged.
                            # For example:
                            #
                            #     | V |
                            #     | e |
                            #     | r |
                            #     | t |
                            #     | i |
                            #     | c |
                            #     | a |
                            #     | l |
                      },
                      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                          # If background_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        &quot;right&quot;: 42, # The right padding of the cell.
                        &quot;bottom&quot;: 42, # The bottom padding of the cell.
                        &quot;left&quot;: 42, # The left padding of the cell.
                        &quot;top&quot;: 42, # The top padding of the cell.
                      },
                      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # serial number format.
                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                            # (in the spreadsheet&#x27;s locale).
                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                      },
                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                          # `&quot;123&quot;`.
                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # &quot;serial number&quot; format.
                    },
                    &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                        #
                        # When writing, the new data validation rule will overwrite any prior rule.
                      &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                          # If true, &quot;List&quot; conditions will show a dropdown.
                      &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                      &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                      &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                          # BooleanConditions are used by conditional formatting,
                          # data validation, and the criteria in filters.
                        &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                            # on the condition type.  Some support zero values,
                            # others one or two values,
                            # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                          { # The value of the condition.
                            &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                                # Valid only if the type is
                                # DATE_BEFORE,
                                # DATE_AFTER,
                                # DATE_ON_OR_BEFORE or
                                # DATE_ON_OR_AFTER.
                                #
                                # Relative dates are not supported in data validation.
                                # They are supported only in conditional formatting and
                                # conditional filters.
                            &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                                # The value is parsed as if the user typed into a cell.
                                # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                          },
                        ],
                        &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                      },
                    },
                    &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                        # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                        # in the userEnteredValue.formulaValue
                        # field.)
                  },
                ],
              },
            ],
            &quot;rowMetadata&quot;: [ # Metadata about the requested rows in the grid, starting with the row
                # in start_row.
              { # Properties about a dimension.
                &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                    # This field is read-only.
                &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                  { # Developer metadata associated with a location or object in a spreadsheet.
                      # Developer metadata may be used to associate arbitrary data with various
                      # parts of a spreadsheet and will remain associated at those locations as they
                      # move around and the spreadsheet is edited.  For example, if developer
                      # metadata is associated with row 5 and another row is then subsequently
                      # inserted above row 5, that original metadata will still be associated with
                      # the row it was first associated with (what is now row 6). If the associated
                      # object is deleted its metadata is deleted too.
                    &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                        # same key.  Developer metadata must always have a key specified.
                    &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                    &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                        # specified.
                    &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                        # specified when metadata is created, otherwise one will be randomly
                        # generated and assigned. Must be positive.
                    &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                      &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                      &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                      &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                      &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                          # a dimension. The specified DimensionRange must represent a single row
                          # or column; it cannot be unbounded or span multiple rows or columns.
                          # All indexes are zero-based.
                          # Indexes are half open: the start index is inclusive
                          # and the end index is exclusive.
                          # Missing indexes indicate the range is unbounded on that side.
                        &quot;sheetId&quot;: 42, # The sheet this span is on.
                        &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                        &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                        &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                      },
                    },
                  },
                ],
              },
            ],
            &quot;startColumn&quot;: 42, # The first column this GridData refers to, zero-based.
            &quot;startRow&quot;: 42, # The first row this GridData refers to, zero-based.
          },
        ],
      },
    ],
    &quot;spreadsheetId&quot;: &quot;A String&quot;, # The ID of the spreadsheet.
        # This field is read-only.
    &quot;properties&quot;: { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
      &quot;title&quot;: &quot;A String&quot;, # The title of the spreadsheet.
      &quot;defaultFormat&quot;: { # The format of a cell. # The default format of all cells in the spreadsheet.
          # CellData.effectiveFormat will not be set if
          # the cell&#x27;s format is equal to this default format. This field is read-only.
        &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
        &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
        &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
        &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
        &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
          &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
              # the user&#x27;s locale will be used if necessary for the given type.
              # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
              # more information about the supported patterns.
          &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
              # When writing, this field must be set.
        },
        &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
          &quot;left&quot;: { # A border along a cell. # The left border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;top&quot;: { # A border along a cell. # The top border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;right&quot;: { # A border along a cell. # The right border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
        },
        &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
        &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
            # Absent values indicate that the field isn&#x27;t specified.
          &quot;fontSize&quot;: 42, # The size of the font.
          &quot;underline&quot;: True or False, # True if the text is underlined.
          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
              # If foreground_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;bold&quot;: True or False, # True if the text is bold.
          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;italic&quot;: True or False, # True if the text is italicized.
          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
        },
        &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
          &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
              # Measured in degrees. Valid values are between -90 and 90. Positive
              # angles are angled upwards, negative are angled downwards.
              #
              # Note: For LTR text direction positive angles are in the
              # counterclockwise direction, whereas for RTL they are in the clockwise
              # direction
          &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
              # characters is unchanged.
              # For example:
              #
              #     | V |
              #     | e |
              #     | r |
              #     | t |
              #     | i |
              #     | c |
              #     | a |
              #     | l |
        },
        &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
            # If background_color is also set, this field takes precedence.
          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
        },
        &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
            # When updating padding, every field must be specified.
          &quot;right&quot;: 42, # The right padding of the cell.
          &quot;bottom&quot;: 42, # The bottom padding of the cell.
          &quot;left&quot;: 42, # The left padding of the cell.
          &quot;top&quot;: 42, # The top padding of the cell.
        },
        &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        },
      },
      &quot;autoRecalc&quot;: &quot;A String&quot;, # The amount of time to wait before volatile functions are recalculated.
      &quot;iterativeCalculationSettings&quot;: { # Settings to control how circular dependencies are resolved with iterative # Determines whether and how circular references are resolved with iterative
          # calculation.  Absence of this field means that circular references result
          # in calculation errors.
          # calculation.
        &quot;maxIterations&quot;: 42, # When iterative calculation is enabled, the maximum number of calculation
            # rounds to perform.
        &quot;convergenceThreshold&quot;: 3.14, # When iterative calculation is enabled and successive results differ by
            # less than this threshold value, the calculation rounds stop.
      },
      &quot;timeZone&quot;: &quot;A String&quot;, # The time zone of the spreadsheet, in CLDR format such as
          # `America/New_York`. If the time zone isn&#x27;t recognized, this may
          # be a custom time zone such as `GMT-07:00`.
      &quot;spreadsheetTheme&quot;: { # Represents spreadsheet theme # Theme applied to the spreadsheet.
        &quot;primaryFontFamily&quot;: &quot;A String&quot;, # / Name of the primary font family.
        &quot;themeColors&quot;: [ # The spreadsheet theme color pairs. To update you must provide all theme
            # color pairs.
          { # A pair mapping a spreadsheet theme color type to the concrete color it
              # represents.
            &quot;colorType&quot;: &quot;A String&quot;, # The type of the spreadsheet theme color.
            &quot;color&quot;: { # A color value. # The concrete color corresponding to the theme color type.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          },
        ],
      },
      &quot;locale&quot;: &quot;A String&quot;, # The locale of the spreadsheet in one of the following formats:
          #
          # * an ISO 639-1 language code such as `en`
          #
          # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
          #
          # * a combination of the ISO language code and country code, such as `en_US`
          #
          # Note: when updating this field, not all locales/languages are supported.
    },
    &quot;namedRanges&quot;: [ # The named ranges defined in a spreadsheet.
      { # A named range.
        &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
        &quot;range&quot;: { # A range on a sheet. # The range this represents.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
          &quot;sheetId&quot;: 42, # The sheet this range is on.
          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
        },
        &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
      },
    ],
    &quot;developerMetadata&quot;: [ # The developer metadata associated with a spreadsheet.
      { # Developer metadata associated with a location or object in a spreadsheet.
          # Developer metadata may be used to associate arbitrary data with various
          # parts of a spreadsheet and will remain associated at those locations as they
          # move around and the spreadsheet is edited.  For example, if developer
          # metadata is associated with row 5 and another row is then subsequently
          # inserted above row 5, that original metadata will still be associated with
          # the row it was first associated with (what is now row 6). If the associated
          # object is deleted its metadata is deleted too.
        &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
            # same key.  Developer metadata must always have a key specified.
        &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
        &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
            # specified.
        &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
            # specified when metadata is created, otherwise one will be randomly
            # generated and assigned. Must be positive.
        &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
          &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
          &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
          &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
          &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
              # a dimension. The specified DimensionRange must represent a single row
              # or column; it cannot be unbounded or span multiple rows or columns.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="get">get(spreadsheetId, includeGridData=None, ranges=None, x__xgafv=None)</code>
  <pre>Returns the spreadsheet at the given ID.
The caller must specify the spreadsheet ID.

By default, data within grids will not be returned.
You can include grid data one of two ways:

* Specify a field mask listing your desired fields using the `fields` URL
parameter in HTTP

* Set the includeGridData
URL parameter to true.  If a field mask is set, the `includeGridData`
parameter is ignored

For large spreadsheets, it is recommended to retrieve only the specific
fields of the spreadsheet that you want.

To retrieve only subsets of the spreadsheet, use the
ranges URL parameter.
Multiple ranges can be specified.  Limiting the range will
return only the portions of the spreadsheet that intersect the requested
ranges. Ranges are specified using A1 notation.

Args:
  spreadsheetId: string, The spreadsheet to request. (required)
  includeGridData: boolean, True if grid data should be returned.
This parameter is ignored if a field mask was set in the request.
  ranges: string, The ranges to retrieve from the spreadsheet. (repeated)
  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Resource that represents a spreadsheet.
    &quot;spreadsheetUrl&quot;: &quot;A String&quot;, # The url of the spreadsheet.
        # This field is read-only.
    &quot;sheets&quot;: [ # The sheets that are part of a spreadsheet.
      { # A sheet in a spreadsheet.
        &quot;rowGroups&quot;: [ # All row groups on this sheet, ordered by increasing range start index, then
            # by group depth.
          { # A group over an interval of rows or columns on a sheet, which can contain or
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        ],
        &quot;columnGroups&quot;: [ # All column groups on this sheet, ordered by increasing range start index,
            # then by group depth.
          { # A group over an interval of rows or columns on a sheet, which can contain or
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        ],
        &quot;slicers&quot;: [ # The slicers on this sheet.
          { # A slicer in a sheet.
            &quot;slicerId&quot;: 42, # The ID of the slicer.
            &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
              &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                  # If not set, default to `True`.
              &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                  # If unspecified, defaults to `LEFT`
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
                # existing sheet. Also, width and height of slicer can be automatically
                # adjusted to keep it within permitted limits.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        ],
        &quot;developerMetadata&quot;: [ # The developer metadata associated with a sheet.
          { # Developer metadata associated with a location or object in a spreadsheet.
              # Developer metadata may be used to associate arbitrary data with various
              # parts of a spreadsheet and will remain associated at those locations as they
              # move around and the spreadsheet is edited.  For example, if developer
              # metadata is associated with row 5 and another row is then subsequently
              # inserted above row 5, that original metadata will still be associated with
              # the row it was first associated with (what is now row 6). If the associated
              # object is deleted its metadata is deleted too.
            &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                # same key.  Developer metadata must always have a key specified.
            &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
            &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                # specified.
            &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                # specified when metadata is created, otherwise one will be randomly
                # generated and assigned. Must be positive.
            &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
              &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
              &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
              &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
              &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                  # a dimension. The specified DimensionRange must represent a single row
                  # or column; it cannot be unbounded or span multiple rows or columns.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          },
        ],
        &quot;filterViews&quot;: [ # The filter views in this sheet.
          { # A filter view.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
        ],
        &quot;charts&quot;: [ # The specifications of every chart on this sheet.
          { # A chart embedded in a sheet.
            &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
              &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                  # chart&lt;/a&gt;.
                &quot;data&quot;: [ # The Candlestick chart data.
                    # Only one CandlestickData is supported.
                  { # The Candlestick chart data, each containing the low, open, close, and high
                      # values for a series.
                    &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                        # candle. This is the bottom of the candle body.  If less than the close
                        # value the candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                        # candle. This is the top of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                        # This is the top of the candle body.  If greater than the open value the
                        # candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                        # This is the bottom of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                  },
                ],
                &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                    # will be treated as discrete labels, other data will be treated as
                    # continuous values.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              },
              &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                  # A histogram chart groups data items into bins, displaying each bin as a
                  # column of stacked items.  Histograms are used to display the distribution
                  # of a dataset.  Each column of items represents a range into which those
                  # items fall.  The number of bins can be chosen automatically or specified
                  # explicitly.
                &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                    # column.
                &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                    # bucketed or multiple series, each of the same length, containing the name
                    # of the series followed by the values to be bucketed for that series.
                  { # A histogram series containing the series color and data.
                    &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # If bar_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                    # column) is chosen automatically, but it may be overridden here.
                    # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                    # Cannot be negative.
                    # This field is optional.
                &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                    # affect the calculation of bucket sizes.  For example, setting an outlier
                    # percentile of 0.05 indicates that the top and bottom 5% of values when
                    # calculating buckets.  The values are still included in the chart, they will
                    # be added to the first or last buckets instead of their own buckets.
                    # Must be between 0.0 and 0.5.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
                &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                    # on the treemap chart. These levels are not interactive and are shown
                    # without their labels. Defaults to 0 if not specified.
                &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                    # interactive and are shown with their labels. Defaults to 2 if not
                    # specified.
                &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                    # assigned colors based on their color values. These color values come from
                    # color_data, or from size_data if color_data is not specified.
                    # Cells with color values less than or equal to min_value will
                    # have minValueColor as their
                    # background color. Cells with color values greater than or equal to
                    # max_value will have
                    # maxValueColor as their background
                    # color. Cells with color values between min_value and max_value will
                    # have background colors on a gradient between
                    # minValueColor and
                    # maxValueColor, the midpoint of
                    # the gradient being midValueColor.
                    # Cells with missing or non-numeric color values will have
                    # noDataColor as their background
                    # color.
                  &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # If no_data_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # If min_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # If mid_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # If max_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                    # If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual minimum value from color_data, or the minimum value from
                    # size_data if color_data is not specified.
                &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual maximum value from color_data, or the maximum value from
                    # size_data if color_data is not specified.
                &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                    # This field is optional. If not specified, size_data is used to
                    # determine background colors. If specified, the data is expected to be
                    # numeric. color_scale will determine how the values in this data map to
                    # data cell background colors.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                    # expected to be numeric. The cells corresponding to non-numeric or missing
                    # data will not be rendered. If color_data is not specified, this data
                    # is used to determine data cell background colors as well.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                &quot;series&quot;: [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                    &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                        # chartType is AREA,
                        # LINE, or SCATTER.
                        # COMBO charts are also supported if the
                        # series chart type is
                        # AREA or LINE.
                      &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                      &quot;width&quot;: 42, # The thickness of the line, in px.
                    },
                    &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the &quot;Volume&quot; series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn&#x27;t a valid minor axis
                        # for the chart&#x27;s type.
                    &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                    # Applies to Bar and Column charts.
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                    # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
                &quot;domains&quot;: [ # The domain of data this is charting.
                    # Only a single domain is supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  },
                ],
                &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                    # Applies to Line charts.
                &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                    # chart area.
                &quot;axis&quot;: [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                    &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                    &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                    &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                        # values in an axis).
                      &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                          # automatically determine a minimum value that looks good for the data.
                      &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                      &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                          # automatically determine a maximum value that looks good for the data.
                    },
                  },
                ],
                &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
                &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                    # segments of lines in a line chart will be missing).  To eliminate these
                    # gaps set this to true.
                    # Applies to Line, Area, and Combo charts.
              },
              &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
              &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
                &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
                &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
                &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                  &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                  &quot;width&quot;: 42, # The thickness of the line, in px.
                },
                &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                  { # A single series of data for a waterfall chart.
                    &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                        # subtotals are defined is not significant. Only one subtotal may be
                        # defined for each data point.
                      { # A custom subtotal column for a waterfall chart series.
                        &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                            # data_is_subtotal is true, the data point at this index is the
                            # subtotal. Otherwise, the subtotal appears after the data point with
                            # this index. A series can have multiple subtotals at arbitrary indices,
                            # but subtotals do not affect the indices of the data points. For
                            # example, if a series has three data points, their indices will always
                            # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                            # what data points they are associated with.
                        &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                            # the subtotal will be computed and appear after the data point.
                        &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                      },
                    ],
                    &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                        # a subtotal column will appear at the end of each series. Setting this
                        # field to true will hide that subtotal column for this series.
                    &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                  },
                ],
                &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
              },
              &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                  # Org charts require a unique set of labels in labels and may
                  # optionally include parent_labels and tooltips.
                  # parent_labels contain, for each node, the label identifying the parent
                  # node.  tooltips contain, for each node, an optional tooltip.
                  #
                  # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                  # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                  # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                  # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                  # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                    # A blank value indicates that the node has no parent and is a top-level
                    # node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                    # If selected_node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                    # If node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                    # results in no tooltip being displayed for the node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
                &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                    # must be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
                &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
                &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
                &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                  # for accessibility.
              &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                  # axis labels, legend).  If a font is specified for a specific part of the
                  # chart it will override this font name.
              &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                  # minimum padding.  False to use the default padding.
                  # (Not applicable to Geo and Org charts.)
              &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                  # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                  # represent things like total sales, average cost, or a top selling item. You
                  # can specify a single data value, or aggregate over a range of data.
                  # Percentage or absolute difference from a baseline value can be highlighted,
                  # like changes over time.
                &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                    # This field is optional.
                &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                    # This field is optional.
                &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                    # 10 can be used to divide all values in the chart by 10.
                    # This field is optional.
                &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                    # This field is needed only if baseline_value_data is specified.
                  &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                      # This field is optional.
                  &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # If positive_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # If negative_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                },
                &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                    # chart. This field is used only when number_format_source is set to
                    # CUSTOM. This field is optional.
                  &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                      # This field is optional.
                  &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                      # This field is optional.
                },
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
              &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
              &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
                &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                    # 0 is fully transparent and 1 is fully opaque.
                &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                    # the bubbles at different sizes relative to each other.
                    # If specified, group_ids must also be specified.  This field is
                    # optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                    # If specific, the field must be a positive value.
                &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                    # If specified, the field must be a positive value.
                &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                    # If bubble_border_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                    # ID are drawn in the same color. If bubble_sizes is specified then
                    # this field must also be specified but may contain blank values.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                    # in the chart vertically.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
                &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                    # in the chart horizontally.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                    # Underline and Strikethrough are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
              },
            },
            &quot;chartId&quot;: 42, # The ID of the chart.
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        ],
        &quot;protectedRanges&quot;: [ # The protected ranges in this sheet.
          { # A protected range.
            &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                # This field is read-only.
            &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
            &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                &quot;A String&quot;,
              ],
              &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                &quot;A String&quot;,
              ],
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
          },
        ],
        &quot;basicFilter&quot;: { # The default filter associated with a sheet. # The filter on this sheet, if any.
          &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
              # The map&#x27;s key is the column index, and the value is the criteria for
              # that column.
            &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
              &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                  # shown. Mutually exclusive with visible_foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hidden_values -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                  # are shown. Mutually exclusive with visible_background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                  # shown. This field is mutually exclusive with visible_foreground_color,
                  # and must be set to an RGB-type color. If visible_background_color is
                  # also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                  # are shown. This field is mutually exclusive with
                  # visible_background_color, and must be set to an RGB-type color. If
                  # visible_foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;hiddenValues&quot;: [ # Values that should be hidden.
                &quot;A String&quot;,
              ],
            },
          },
          &quot;range&quot;: { # A range on a sheet. # The range the filter covers.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color, and must be an
                  # RGB-type color. If background_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
              &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color, and must
                  # be an RGB-type color. If foreground_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          ],
        },
        &quot;merges&quot;: [ # The ranges that are merged together.
          { # A range on a sheet.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        ],
        &quot;bandedRanges&quot;: [ # The banded (alternating colors) ranges on this sheet.
          { # A banded (alternating colors) range in a sheet.
            &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;bandedRangeId&quot;: 42, # The id of the banded range.
            &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          },
        ],
        &quot;properties&quot;: { # Properties of a sheet. # The properties of the sheet.
          &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
              # When adding or updating sheet properties, if this field
              # is excluded then the sheet is added or moved to the end
              # of the sheet list. When updating sheet indices or inserting
              # sheets, movement is considered in &quot;before the move&quot; indexes.
              # For example, if there were 3 sheets (S1, S2, S3) in order to
              # move S1 ahead of S2 the index would have to be set to 2. A sheet
              # index update request is ignored if the requested index is
              # identical to the sheets current index or if the requested new
              # index is equal to the current sheet index + 1.
          &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
          &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
              # (If the sheet is an object sheet, containing a chart or image, then
              # this field will be absent.)
              # When writing it is an error to set any grid properties on non-grid sheets.
            &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
            &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
            &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
            &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
            &quot;rowCount&quot;: 42, # The number of rows in the grid.
            &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
            &quot;columnCount&quot;: 42, # The number of columns in the grid.
          },
          &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
              # This field cannot be changed once set.
          &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
          &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
              # If tab_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
          &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
              # This field cannot be changed once set.
        },
        &quot;conditionalFormats&quot;: [ # The conditional format rules in this sheet.
          { # A rule describing a conditional format.
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        ],
        &quot;data&quot;: [ # Data in the grid, if this is a grid sheet.
            #
            # The number of GridData objects returned is dependent on the number of
            # ranges requested on this sheet. For example, if this is representing
            # `Sheet1`, and the spreadsheet was requested with ranges
            # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
            # startRow/startColumn of `0`,
            # while the second one will have `startRow 14` (zero-based row 15),
            # and `startColumn 3` (zero-based column D).
          { # Data in the grid, as well as metadata about the dimensions.
            &quot;columnMetadata&quot;: [ # Metadata about the requested columns in the grid, starting with the column
                # in start_column.
              { # Properties about a dimension.
                &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                    # This field is read-only.
                &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                  { # Developer metadata associated with a location or object in a spreadsheet.
                      # Developer metadata may be used to associate arbitrary data with various
                      # parts of a spreadsheet and will remain associated at those locations as they
                      # move around and the spreadsheet is edited.  For example, if developer
                      # metadata is associated with row 5 and another row is then subsequently
                      # inserted above row 5, that original metadata will still be associated with
                      # the row it was first associated with (what is now row 6). If the associated
                      # object is deleted its metadata is deleted too.
                    &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                        # same key.  Developer metadata must always have a key specified.
                    &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                    &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                        # specified.
                    &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                        # specified when metadata is created, otherwise one will be randomly
                        # generated and assigned. Must be positive.
                    &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                      &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                      &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                      &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                      &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                          # a dimension. The specified DimensionRange must represent a single row
                          # or column; it cannot be unbounded or span multiple rows or columns.
                          # All indexes are zero-based.
                          # Indexes are half open: the start index is inclusive
                          # and the end index is exclusive.
                          # Missing indexes indicate the range is unbounded on that side.
                        &quot;sheetId&quot;: 42, # The sheet this span is on.
                        &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                        &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                        &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                      },
                    },
                  },
                ],
              },
            ],
            &quot;rowData&quot;: [ # The data in the grid, one entry per row,
                # starting with the row in startRow.
                # The values in RowData will correspond to columns starting
                # at start_column.
              { # Data about each cell in a row.
                &quot;values&quot;: [ # The values in the row, one per column.
                  { # Data about a specific cell.
                    &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                        # is computed dynamically based on its data, grouping, filters, values,
                        # etc. Only the top-left cell of the pivot table contains the pivot table
                        # definition. The other cells will contain the calculated values of the
                        # results of the pivot in their effective_value fields.
                      &quot;rows&quot;: [ # Each row grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                          &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                          &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group&#x27;s values.
                            &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                            &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group &amp; two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                # this would correspond to using the &quot;Total&quot; of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            ],
                          },
                          &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                              # This is only valid for row groupings and is ignored by columns.
                              #
                              # By default, we minimize repitition of headings by not showing higher
                              # level headings where they are the same. For example, even though the
                              # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                              # it is redundant with previous rows. Setting repeat_headings to true
                              # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                              #
                              #     +--------------+
                              #     | Q1     | Jan |
                              #     |        | Feb |
                              #     |        | Mar |
                              #     +--------+-----+
                              #     | Q1 Total     |
                              #     +--------------+
                          &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                              &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            },
                          ],
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                              # in the source data column rather than breaking out each individual value.
                              # Only one PivotGroup with a group rule may be added for each column in
                              # the source data, though on any given column you may add both a
                              # PivotGroup that has a rule and a PivotGroup that does not.
                            &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                # buckets of a constant size. All values from HistogramRule.start to
                                # HistogramRule.end are placed into groups of size
                                # HistogramRule.interval. In addition, all values below
                                # HistogramRule.start are placed in one group, and all values above
                                # HistogramRule.end are placed in another. Only
                                # HistogramRule.interval is required, though if HistogramRule.start
                                # and HistogramRule.end are both provided, HistogramRule.start must
                                # be less than HistogramRule.end. For example, a pivot table showing
                                # average purchase amount by age that has 50+ rows:
                                #
                                #     +-----+-------------------+
                                #     | Age | AVERAGE of Amount |
                                #     +-----+-------------------+
                                #     | 16  |            $27.13 |
                                #     | 17  |             $5.24 |
                                #     | 18  |            $20.15 |
                                #     ...
                                #     +-----+-------------------+
                                # could be turned into a pivot table that looks like the one below by
                                # applying a histogram group rule with a HistogramRule.start of 25,
                                # an HistogramRule.interval of 20, and an HistogramRule.end
                                # of 65.
                                #
                                #     +-------------+-------------------+
                                #     | Grouped Age | AVERAGE of Amount |
                                #     +-------------+-------------------+
                                #     | &lt; 25        |            $19.34 |
                                #     | 25-45       |            $31.43 |
                                #     | 45-65       |            $35.87 |
                                #     | &gt; 65        |            $27.55 |
                                #     +-------------+-------------------+
                                #     | Grand Total |            $29.12 |
                                #     +-------------+-------------------+
                              &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                  # of constant size. Values below start are lumped into a single bucket.
                                  # This field is optional.
                              &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                  # of constant size. Values above end are lumped into a single bucket.
                                  # This field is optional.
                              &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                            },
                            &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                # buckets based on selected parts of their date or time values. For example,
                                # consider a pivot table showing sales transactions by date:
                                #
                                #     +----------+--------------+
                                #     | Date     | SUM of Sales |
                                #     +----------+--------------+
                                #     | 1/1/2017 |      $621.14 |
                                #     | 2/3/2017 |      $708.84 |
                                #     | 5/8/2017 |      $326.84 |
                                #     ...
                                #     +----------+--------------+
                                # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                # results in the following pivot table.
                                #
                                #     +--------------+--------------+
                                #     | Grouped Date | SUM of Sales |
                                #     +--------------+--------------+
                                #     | 2017-Jan     |   $53,731.78 |
                                #     | 2017-Feb     |   $83,475.32 |
                                #     | 2017-Mar     |   $94,385.05 |
                                #     ...
                                #     +--------------+--------------+
                              &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                            },
                            &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                # buckets with names of your choosing. For example, a pivot table that
                                # aggregates population by state:
                                #
                                #     +-------+-------------------+
                                #     | State | SUM of Population |
                                #     +-------+-------------------+
                                #     | AK    |               0.7 |
                                #     | AL    |               4.8 |
                                #     | AR    |               2.9 |
                                #     ...
                                #     +-------+-------------------+
                                # could be turned into a pivot table that aggregates population by time zone
                                # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                # Note that a similar effect could be achieved by adding a time zone column
                                # to the source data and adjusting the pivot table.
                                #
                                #     +-----------+-------------------+
                                #     | Time Zone | SUM of Population |
                                #     +-----------+-------------------+
                                #     | Central   |             106.3 |
                                #     | Eastern   |             151.9 |
                                #     | Mountain  |              17.4 |
                                #     ...
                                #     +-----------+-------------------+
                              &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                  # that map to each group name.
                                { # A group name and a list of items from the source data that should be placed
                                    # in the group with this name.
                                  &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                      # item may be a string, number, or boolean. Items may appear in at most one
                                      # group within a given ManualRule. Items that do not appear in any
                                      # group will appear on their own.
                                    { # The kinds of value that a cell in a spreadsheet can have.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  ],
                                  &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                      # ManualRule must have a unique group name.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                },
                              ],
                            },
                          },
                          &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                              # example, in the following pivot table, the row label is `Region` (which
                              # could be renamed to `State`) and the column label is `Product` (which
                              # could be renamed `Item`). Pivot tables created before December 2017 do
                              # not have header labels. If you&#x27;d like to add header labels to an existing
                              # pivot table, please delete the existing pivot table and then create a new
                              # pivot table with same parameters.
                              #
                              #     +--------------+---------+-------+
                              #     | SUM of Units | Product |       |
                              #     | Region       | Pen     | Paper |
                              #     +--------------+---------+-------+
                              #     | New York     |     345 |    98 |
                              #     | Oregon       |     234 |   123 |
                              #     | Tennessee    |     531 |   415 |
                              #     +--------------+---------+-------+
                              #     | Grand Total  |    1110 |   636 |
                              #     +--------------+---------+-------+
                        },
                      ],
                      &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                      &quot;values&quot;: [ # A list of values to include in the pivot table.
                        { # The definition of how a value in a pivot table should be calculated.
                          &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                              # the result of a calculation with another pivot value. For example, if
                              # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                              # pivot values are displayed as the percentage of the grand total. In
                              # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                              # pivot table.
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this value refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                              # with an `=` character.
                          &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                              # If formula is set, the only supported values are
                              # SUM and
                              # CUSTOM.
                              # If sourceColumnOffset is set, then `CUSTOM`
                              # is not supported.
                          &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                        },
                      ],
                      &quot;columns&quot;: [ # Each column grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                          &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                          &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group&#x27;s values.
                            &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                            &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group &amp; two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                # this would correspond to using the &quot;Total&quot; of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            ],
                          },
                          &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                              # This is only valid for row groupings and is ignored by columns.
                              #
                              # By default, we minimize repitition of headings by not showing higher
                              # level headings where they are the same. For example, even though the
                              # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                              # it is redundant with previous rows. Setting repeat_headings to true
                              # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                              #
                              #     +--------------+
                              #     | Q1     | Jan |
                              #     |        | Feb |
                              #     |        | Mar |
                              #     +--------+-----+
                              #     | Q1 Total     |
                              #     +--------------+
                          &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                              &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            },
                          ],
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                              # in the source data column rather than breaking out each individual value.
                              # Only one PivotGroup with a group rule may be added for each column in
                              # the source data, though on any given column you may add both a
                              # PivotGroup that has a rule and a PivotGroup that does not.
                            &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                # buckets of a constant size. All values from HistogramRule.start to
                                # HistogramRule.end are placed into groups of size
                                # HistogramRule.interval. In addition, all values below
                                # HistogramRule.start are placed in one group, and all values above
                                # HistogramRule.end are placed in another. Only
                                # HistogramRule.interval is required, though if HistogramRule.start
                                # and HistogramRule.end are both provided, HistogramRule.start must
                                # be less than HistogramRule.end. For example, a pivot table showing
                                # average purchase amount by age that has 50+ rows:
                                #
                                #     +-----+-------------------+
                                #     | Age | AVERAGE of Amount |
                                #     +-----+-------------------+
                                #     | 16  |            $27.13 |
                                #     | 17  |             $5.24 |
                                #     | 18  |            $20.15 |
                                #     ...
                                #     +-----+-------------------+
                                # could be turned into a pivot table that looks like the one below by
                                # applying a histogram group rule with a HistogramRule.start of 25,
                                # an HistogramRule.interval of 20, and an HistogramRule.end
                                # of 65.
                                #
                                #     +-------------+-------------------+
                                #     | Grouped Age | AVERAGE of Amount |
                                #     +-------------+-------------------+
                                #     | &lt; 25        |            $19.34 |
                                #     | 25-45       |            $31.43 |
                                #     | 45-65       |            $35.87 |
                                #     | &gt; 65        |            $27.55 |
                                #     +-------------+-------------------+
                                #     | Grand Total |            $29.12 |
                                #     +-------------+-------------------+
                              &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                  # of constant size. Values below start are lumped into a single bucket.
                                  # This field is optional.
                              &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                  # of constant size. Values above end are lumped into a single bucket.
                                  # This field is optional.
                              &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                            },
                            &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                # buckets based on selected parts of their date or time values. For example,
                                # consider a pivot table showing sales transactions by date:
                                #
                                #     +----------+--------------+
                                #     | Date     | SUM of Sales |
                                #     +----------+--------------+
                                #     | 1/1/2017 |      $621.14 |
                                #     | 2/3/2017 |      $708.84 |
                                #     | 5/8/2017 |      $326.84 |
                                #     ...
                                #     +----------+--------------+
                                # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                # results in the following pivot table.
                                #
                                #     +--------------+--------------+
                                #     | Grouped Date | SUM of Sales |
                                #     +--------------+--------------+
                                #     | 2017-Jan     |   $53,731.78 |
                                #     | 2017-Feb     |   $83,475.32 |
                                #     | 2017-Mar     |   $94,385.05 |
                                #     ...
                                #     +--------------+--------------+
                              &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                            },
                            &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                # buckets with names of your choosing. For example, a pivot table that
                                # aggregates population by state:
                                #
                                #     +-------+-------------------+
                                #     | State | SUM of Population |
                                #     +-------+-------------------+
                                #     | AK    |               0.7 |
                                #     | AL    |               4.8 |
                                #     | AR    |               2.9 |
                                #     ...
                                #     +-------+-------------------+
                                # could be turned into a pivot table that aggregates population by time zone
                                # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                # Note that a similar effect could be achieved by adding a time zone column
                                # to the source data and adjusting the pivot table.
                                #
                                #     +-----------+-------------------+
                                #     | Time Zone | SUM of Population |
                                #     +-----------+-------------------+
                                #     | Central   |             106.3 |
                                #     | Eastern   |             151.9 |
                                #     | Mountain  |              17.4 |
                                #     ...
                                #     +-----------+-------------------+
                              &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                  # that map to each group name.
                                { # A group name and a list of items from the source data that should be placed
                                    # in the group with this name.
                                  &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                      # item may be a string, number, or boolean. Items may appear in at most one
                                      # group within a given ManualRule. Items that do not appear in any
                                      # group will appear on their own.
                                    { # The kinds of value that a cell in a spreadsheet can have.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  ],
                                  &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                      # ManualRule must have a unique group name.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                },
                              ],
                            },
                          },
                          &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                              # example, in the following pivot table, the row label is `Region` (which
                              # could be renamed to `State`) and the column label is `Product` (which
                              # could be renamed `Item`). Pivot tables created before December 2017 do
                              # not have header labels. If you&#x27;d like to add header labels to an existing
                              # pivot table, please delete the existing pivot table and then create a new
                              # pivot table with same parameters.
                              #
                              #     +--------------+---------+-------+
                              #     | SUM of Units | Product |       |
                              #     | Region       | Pen     | Paper |
                              #     +--------------+---------+-------+
                              #     | New York     |     345 |    98 |
                              #     | Oregon       |     234 |   123 |
                              #     | Tennessee    |     531 |   415 |
                              #     +--------------+---------+-------+
                              #     | Grand Total  |    1110 |   636 |
                              #     +--------------+---------+-------+
                        },
                      ],
                      &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                          # or vertically (as rows).
                      &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                          #
                          # The filters are applied before aggregating data into the pivot table.
                          # The map&#x27;s key is the column offset of the source range that you want to
                          # filter, and the value is the criteria for that column.
                          #
                          # For example, if the source was `C10:E15`, a key of `0` will have the filter
                          # for column `C`, whereas the key `1` is for column `D`.
                        &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                          &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                            &quot;A String&quot;,
                          ],
                        },
                      },
                    },
                    &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                        # This is the value as it&#x27;s shown to the user.
                        # This field is read-only.
                    &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                        # on user entered strings, not formulas, bools, or numbers.
                        # Runs start at specific indexes in the text and continue until the next
                        # run. Properties of a run will continue unless explicitly changed
                        # in a subsequent run (and properties of the first run will continue
                        # the properties of the cell unless explicitly changed).
                        #
                        # When writing, the new runs will overwrite any prior runs.  When writing a
                        # new user_entered_value, previous runs are erased.
                      { # A run of a text format. The format of this run continues until the start
                          # index of the next run.
                          # When updating, all fields must be set.
                        &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                            # Absent values indicate that the field isn&#x27;t specified.
                          &quot;fontSize&quot;: 42, # The size of the font.
                          &quot;underline&quot;: True or False, # True if the text is underlined.
                          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                              # If foreground_color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;bold&quot;: True or False, # True if the text is bold.
                          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;italic&quot;: True or False, # True if the text is italicized.
                          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                        },
                        &quot;startIndex&quot;: 42, # The character index where this run starts.
                      },
                    ],
                    &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                        # the calculated value.  For cells with literals, this is
                        # the same as the user_entered_value.
                        # This field is read-only.
                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                            # (in the spreadsheet&#x27;s locale).
                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                      },
                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                          # `&quot;123&quot;`.
                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # &quot;serial number&quot; format.
                    },
                    &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                        # This includes the results of applying any conditional formatting and,
                        # if the cell contains a formula, the computed number format.
                        # If the effective format is the default format, effective format will
                        # not be written.
                        # This field is read-only.
                      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user&#x27;s locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                            # more information about the supported patterns.
                        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                            # When writing, this field must be set.
                      },
                      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                      },
                      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                            # Measured in degrees. Valid values are between -90 and 90. Positive
                            # angles are angled upwards, negative are angled downwards.
                            #
                            # Note: For LTR text direction positive angles are in the
                            # counterclockwise direction, whereas for RTL they are in the clockwise
                            # direction
                        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                            # characters is unchanged.
                            # For example:
                            #
                            #     | V |
                            #     | e |
                            #     | r |
                            #     | t |
                            #     | i |
                            #     | c |
                            #     | a |
                            #     | l |
                      },
                      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                          # If background_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        &quot;right&quot;: 42, # The right padding of the cell.
                        &quot;bottom&quot;: 42, # The bottom padding of the cell.
                        &quot;left&quot;: 42, # The left padding of the cell.
                        &quot;top&quot;: 42, # The top padding of the cell.
                      },
                      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                    &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                        #
                        # When writing, the new format will be merged with the existing format.
                      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user&#x27;s locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                            # more information about the supported patterns.
                        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                            # When writing, this field must be set.
                      },
                      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                      },
                      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                            # Measured in degrees. Valid values are between -90 and 90. Positive
                            # angles are angled upwards, negative are angled downwards.
                            #
                            # Note: For LTR text direction positive angles are in the
                            # counterclockwise direction, whereas for RTL they are in the clockwise
                            # direction
                        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                            # characters is unchanged.
                            # For example:
                            #
                            #     | V |
                            #     | e |
                            #     | r |
                            #     | t |
                            #     | i |
                            #     | c |
                            #     | a |
                            #     | l |
                      },
                      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                          # If background_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        &quot;right&quot;: 42, # The right padding of the cell.
                        &quot;bottom&quot;: 42, # The bottom padding of the cell.
                        &quot;left&quot;: 42, # The left padding of the cell.
                        &quot;top&quot;: 42, # The top padding of the cell.
                      },
                      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # serial number format.
                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                            # (in the spreadsheet&#x27;s locale).
                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                      },
                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                          # `&quot;123&quot;`.
                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # &quot;serial number&quot; format.
                    },
                    &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                        #
                        # When writing, the new data validation rule will overwrite any prior rule.
                      &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                          # If true, &quot;List&quot; conditions will show a dropdown.
                      &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                      &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                      &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                          # BooleanConditions are used by conditional formatting,
                          # data validation, and the criteria in filters.
                        &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                            # on the condition type.  Some support zero values,
                            # others one or two values,
                            # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                          { # The value of the condition.
                            &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                                # Valid only if the type is
                                # DATE_BEFORE,
                                # DATE_AFTER,
                                # DATE_ON_OR_BEFORE or
                                # DATE_ON_OR_AFTER.
                                #
                                # Relative dates are not supported in data validation.
                                # They are supported only in conditional formatting and
                                # conditional filters.
                            &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                                # The value is parsed as if the user typed into a cell.
                                # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                          },
                        ],
                        &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                      },
                    },
                    &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                        # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                        # in the userEnteredValue.formulaValue
                        # field.)
                  },
                ],
              },
            ],
            &quot;rowMetadata&quot;: [ # Metadata about the requested rows in the grid, starting with the row
                # in start_row.
              { # Properties about a dimension.
                &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                    # This field is read-only.
                &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                  { # Developer metadata associated with a location or object in a spreadsheet.
                      # Developer metadata may be used to associate arbitrary data with various
                      # parts of a spreadsheet and will remain associated at those locations as they
                      # move around and the spreadsheet is edited.  For example, if developer
                      # metadata is associated with row 5 and another row is then subsequently
                      # inserted above row 5, that original metadata will still be associated with
                      # the row it was first associated with (what is now row 6). If the associated
                      # object is deleted its metadata is deleted too.
                    &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                        # same key.  Developer metadata must always have a key specified.
                    &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                    &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                        # specified.
                    &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                        # specified when metadata is created, otherwise one will be randomly
                        # generated and assigned. Must be positive.
                    &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                      &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                      &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                      &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                      &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                          # a dimension. The specified DimensionRange must represent a single row
                          # or column; it cannot be unbounded or span multiple rows or columns.
                          # All indexes are zero-based.
                          # Indexes are half open: the start index is inclusive
                          # and the end index is exclusive.
                          # Missing indexes indicate the range is unbounded on that side.
                        &quot;sheetId&quot;: 42, # The sheet this span is on.
                        &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                        &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                        &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                      },
                    },
                  },
                ],
              },
            ],
            &quot;startColumn&quot;: 42, # The first column this GridData refers to, zero-based.
            &quot;startRow&quot;: 42, # The first row this GridData refers to, zero-based.
          },
        ],
      },
    ],
    &quot;spreadsheetId&quot;: &quot;A String&quot;, # The ID of the spreadsheet.
        # This field is read-only.
    &quot;properties&quot;: { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
      &quot;title&quot;: &quot;A String&quot;, # The title of the spreadsheet.
      &quot;defaultFormat&quot;: { # The format of a cell. # The default format of all cells in the spreadsheet.
          # CellData.effectiveFormat will not be set if
          # the cell&#x27;s format is equal to this default format. This field is read-only.
        &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
        &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
        &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
        &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
        &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
          &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
              # the user&#x27;s locale will be used if necessary for the given type.
              # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
              # more information about the supported patterns.
          &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
              # When writing, this field must be set.
        },
        &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
          &quot;left&quot;: { # A border along a cell. # The left border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;top&quot;: { # A border along a cell. # The top border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;right&quot;: { # A border along a cell. # The right border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
        },
        &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
        &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
            # Absent values indicate that the field isn&#x27;t specified.
          &quot;fontSize&quot;: 42, # The size of the font.
          &quot;underline&quot;: True or False, # True if the text is underlined.
          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
              # If foreground_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;bold&quot;: True or False, # True if the text is bold.
          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;italic&quot;: True or False, # True if the text is italicized.
          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
        },
        &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
          &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
              # Measured in degrees. Valid values are between -90 and 90. Positive
              # angles are angled upwards, negative are angled downwards.
              #
              # Note: For LTR text direction positive angles are in the
              # counterclockwise direction, whereas for RTL they are in the clockwise
              # direction
          &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
              # characters is unchanged.
              # For example:
              #
              #     | V |
              #     | e |
              #     | r |
              #     | t |
              #     | i |
              #     | c |
              #     | a |
              #     | l |
        },
        &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
            # If background_color is also set, this field takes precedence.
          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
        },
        &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
            # When updating padding, every field must be specified.
          &quot;right&quot;: 42, # The right padding of the cell.
          &quot;bottom&quot;: 42, # The bottom padding of the cell.
          &quot;left&quot;: 42, # The left padding of the cell.
          &quot;top&quot;: 42, # The top padding of the cell.
        },
        &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        },
      },
      &quot;autoRecalc&quot;: &quot;A String&quot;, # The amount of time to wait before volatile functions are recalculated.
      &quot;iterativeCalculationSettings&quot;: { # Settings to control how circular dependencies are resolved with iterative # Determines whether and how circular references are resolved with iterative
          # calculation.  Absence of this field means that circular references result
          # in calculation errors.
          # calculation.
        &quot;maxIterations&quot;: 42, # When iterative calculation is enabled, the maximum number of calculation
            # rounds to perform.
        &quot;convergenceThreshold&quot;: 3.14, # When iterative calculation is enabled and successive results differ by
            # less than this threshold value, the calculation rounds stop.
      },
      &quot;timeZone&quot;: &quot;A String&quot;, # The time zone of the spreadsheet, in CLDR format such as
          # `America/New_York`. If the time zone isn&#x27;t recognized, this may
          # be a custom time zone such as `GMT-07:00`.
      &quot;spreadsheetTheme&quot;: { # Represents spreadsheet theme # Theme applied to the spreadsheet.
        &quot;primaryFontFamily&quot;: &quot;A String&quot;, # / Name of the primary font family.
        &quot;themeColors&quot;: [ # The spreadsheet theme color pairs. To update you must provide all theme
            # color pairs.
          { # A pair mapping a spreadsheet theme color type to the concrete color it
              # represents.
            &quot;colorType&quot;: &quot;A String&quot;, # The type of the spreadsheet theme color.
            &quot;color&quot;: { # A color value. # The concrete color corresponding to the theme color type.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          },
        ],
      },
      &quot;locale&quot;: &quot;A String&quot;, # The locale of the spreadsheet in one of the following formats:
          #
          # * an ISO 639-1 language code such as `en`
          #
          # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
          #
          # * a combination of the ISO language code and country code, such as `en_US`
          #
          # Note: when updating this field, not all locales/languages are supported.
    },
    &quot;namedRanges&quot;: [ # The named ranges defined in a spreadsheet.
      { # A named range.
        &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
        &quot;range&quot;: { # A range on a sheet. # The range this represents.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
          &quot;sheetId&quot;: 42, # The sheet this range is on.
          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
        },
        &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
      },
    ],
    &quot;developerMetadata&quot;: [ # The developer metadata associated with a spreadsheet.
      { # Developer metadata associated with a location or object in a spreadsheet.
          # Developer metadata may be used to associate arbitrary data with various
          # parts of a spreadsheet and will remain associated at those locations as they
          # move around and the spreadsheet is edited.  For example, if developer
          # metadata is associated with row 5 and another row is then subsequently
          # inserted above row 5, that original metadata will still be associated with
          # the row it was first associated with (what is now row 6). If the associated
          # object is deleted its metadata is deleted too.
        &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
            # same key.  Developer metadata must always have a key specified.
        &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
        &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
            # specified.
        &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
            # specified when metadata is created, otherwise one will be randomly
            # generated and assigned. Must be positive.
        &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
          &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
          &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
          &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
          &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
              # a dimension. The specified DimensionRange must represent a single row
              # or column; it cannot be unbounded or span multiple rows or columns.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
      },
    ],
  }</pre>
</div>

<div class="method">
    <code class="details" id="getByDataFilter">getByDataFilter(spreadsheetId, body=None, x__xgafv=None)</code>
  <pre>Returns the spreadsheet at the given ID.
The caller must specify the spreadsheet ID.

This method differs from GetSpreadsheet in that it allows selecting
which subsets of spreadsheet data to return by specifying a
dataFilters parameter.
Multiple DataFilters can be specified.  Specifying one or
more data filters will return the portions of the spreadsheet that
intersect ranges matched by any of the filters.

By default, data within grids will not be returned.
You can include grid data one of two ways:

* Specify a field mask listing your desired fields using the `fields` URL
parameter in HTTP

* Set the includeGridData
parameter to true.  If a field mask is set, the `includeGridData`
parameter is ignored

For large spreadsheets, it is recommended to retrieve only the specific
fields of the spreadsheet that you want.

Args:
  spreadsheetId: string, The spreadsheet to request. (required)
  body: object, The request body.
    The object takes the form of:

{ # The request for retrieving a Spreadsheet.
    &quot;includeGridData&quot;: True or False, # True if grid data should be returned.
        # This parameter is ignored if a field mask was set in the request.
    &quot;dataFilters&quot;: [ # The DataFilters used to select which ranges to retrieve from
        # the spreadsheet.
      { # Filter that describes what data should be selected or returned from a
          # request.
        &quot;gridRange&quot;: { # A range on a sheet. # Selects data that matches the range described by the GridRange.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
          &quot;sheetId&quot;: 42, # The sheet this range is on.
          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
        },
        &quot;developerMetadataLookup&quot;: { # Selects DeveloperMetadata that matches all of the specified fields.  For # Selects data associated with the developer metadata matching the criteria
            # described by this DeveloperMetadataLookup.
            # example, if only a metadata ID is specified this considers the
            # DeveloperMetadata with that particular unique ID. If a metadata key is
            # specified, this considers all developer metadata with that key.  If a
            # key, visibility, and location type are all specified, this considers all
            # developer metadata with that key and visibility that are associated with a
            # location of that type.  In general, this
            # selects all DeveloperMetadata that matches the intersection of all the
            # specified fields; any field or combination of fields may be specified.
          &quot;metadataLocation&quot;: { # A location where metadata may be associated in a spreadsheet. # Limits the selected developer metadata to those entries associated with
              # the specified location.  This field either matches exact locations or all
              # intersecting locations according the specified
              # locationMatchingStrategy.
            &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
            &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
            &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
            &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                # a dimension. The specified DimensionRange must represent a single row
                # or column; it cannot be unbounded or span multiple rows or columns.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
          &quot;metadataId&quot;: 42, # Limits the selected developer metadata to that which has a matching
              # DeveloperMetadata.metadata_id.
          &quot;visibility&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
              # DeveloperMetadata.visibility.  If left unspecified, all developer
              # metadata visibile to the requesting project is considered.
          &quot;metadataValue&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
              # DeveloperMetadata.metadata_value.
          &quot;locationType&quot;: &quot;A String&quot;, # Limits the selected developer metadata to those entries which are
              # associated with locations of the specified type.  For example, when this
              # field is specified as ROW this lookup
              # only considers developer metadata associated on rows.  If the field is left
              # unspecified, all location types are considered.  This field cannot be
              # specified as SPREADSHEET when
              # the locationMatchingStrategy
              # is specified as INTERSECTING or when the
              # metadataLocation is specified as a
              # non-spreadsheet location: spreadsheet metadata cannot intersect any other
              # developer metadata location.  This field also must be left unspecified when
              # the locationMatchingStrategy
              # is specified as EXACT.
          &quot;locationMatchingStrategy&quot;: &quot;A String&quot;, # Determines how this lookup matches the location.  If this field is
              # specified as EXACT, only developer metadata associated on the exact
              # location specified is matched.  If this field is specified to INTERSECTING,
              # developer metadata associated on intersecting locations is also
              # matched.  If left unspecified, this field assumes a default value of
              # INTERSECTING.
              # If this field is specified, a metadataLocation
              # must also be specified.
          &quot;metadataKey&quot;: &quot;A String&quot;, # Limits the selected developer metadata to that which has a matching
              # DeveloperMetadata.metadata_key.
        },
        &quot;a1Range&quot;: &quot;A String&quot;, # Selects data that matches the specified A1 range.
      },
    ],
  }

  x__xgafv: string, V1 error format.
    Allowed values
      1 - v1 error format
      2 - v2 error format

Returns:
  An object of the form:

    { # Resource that represents a spreadsheet.
    &quot;spreadsheetUrl&quot;: &quot;A String&quot;, # The url of the spreadsheet.
        # This field is read-only.
    &quot;sheets&quot;: [ # The sheets that are part of a spreadsheet.
      { # A sheet in a spreadsheet.
        &quot;rowGroups&quot;: [ # All row groups on this sheet, ordered by increasing range start index, then
            # by group depth.
          { # A group over an interval of rows or columns on a sheet, which can contain or
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        ],
        &quot;columnGroups&quot;: [ # All column groups on this sheet, ordered by increasing range start index,
            # then by group depth.
          { # A group over an interval of rows or columns on a sheet, which can contain or
              # be contained within other groups. A group can be collapsed or expanded as a
              # unit on the sheet.
            &quot;depth&quot;: 42, # The depth of the group, representing how many groups have a range that
                # wholly contains the range of this group.
            &quot;collapsed&quot;: True or False, # This field is true if this group is collapsed. A collapsed group remains
                # collapsed if an overlapping group at a shallower depth is expanded.
                #
                # A true value does not imply that all dimensions within the group are
                # hidden, since a dimension&#x27;s visibility can change independently from this
                # group property. However, when this property is updated, all dimensions
                # within it are set to hidden if this field is true, or set to visible if
                # this field is false.
            &quot;range&quot;: { # A range along a single dimension on a sheet. # The range over which this group exists.
                # All indexes are zero-based.
                # Indexes are half open: the start index is inclusive
                # and the end index is exclusive.
                # Missing indexes indicate the range is unbounded on that side.
              &quot;sheetId&quot;: 42, # The sheet this span is on.
              &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
              &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
              &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
            },
          },
        ],
        &quot;slicers&quot;: [ # The slicers on this sheet.
          { # A slicer in a sheet.
            &quot;slicerId&quot;: 42, # The ID of the slicer.
            &quot;spec&quot;: { # The specifications of a slicer. # The specification of the slicer.
              &quot;filterCriteria&quot;: { # Criteria for showing/hiding rows in a filter or filter view. # The filtering criteria of the slicer.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
              &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format of title in the slicer.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the slicer.
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the slicer.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;applyToPivotTables&quot;: True or False, # True if the filter should apply to pivot tables.
                  # If not set, default to `True`.
              &quot;dataRange&quot;: { # A range on a sheet. # The data range of the slicer.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
              &quot;columnIndex&quot;: 42, # The column index in the data table on which the filter is applied to.
              &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of title in the slicer.
                  # If unspecified, defaults to `LEFT`
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the slicer.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the slicer. Note that slicer can be positioned only on
                # existing sheet. Also, width and height of slicer can be automatically
                # adjusted to keep it within permitted limits.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        ],
        &quot;developerMetadata&quot;: [ # The developer metadata associated with a sheet.
          { # Developer metadata associated with a location or object in a spreadsheet.
              # Developer metadata may be used to associate arbitrary data with various
              # parts of a spreadsheet and will remain associated at those locations as they
              # move around and the spreadsheet is edited.  For example, if developer
              # metadata is associated with row 5 and another row is then subsequently
              # inserted above row 5, that original metadata will still be associated with
              # the row it was first associated with (what is now row 6). If the associated
              # object is deleted its metadata is deleted too.
            &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                # same key.  Developer metadata must always have a key specified.
            &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
            &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                # specified.
            &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                # specified when metadata is created, otherwise one will be randomly
                # generated and assigned. Must be positive.
            &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
              &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
              &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
              &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
              &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                  # a dimension. The specified DimensionRange must represent a single row
                  # or column; it cannot be unbounded or span multiple rows or columns.
                  # All indexes are zero-based.
                  # Indexes are half open: the start index is inclusive
                  # and the end index is exclusive.
                  # Missing indexes indicate the range is unbounded on that side.
                &quot;sheetId&quot;: 42, # The sheet this span is on.
                &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
              },
            },
          },
        ],
        &quot;filterViews&quot;: [ # The filter views in this sheet.
          { # A filter view.
            &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
                # The map&#x27;s key is the column index, and the value is the criteria for
                # that column.
              &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
                &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                    # shown. Mutually exclusive with visible_foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                    # (This does not override hidden_values -- if a value is listed there,
                    #  it will still be hidden.)
                    # BooleanConditions are used by conditional formatting,
                    # data validation, and the criteria in filters.
                  &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                      # on the condition type.  Some support zero values,
                      # others one or two values,
                      # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                    { # The value of the condition.
                      &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                          # Valid only if the type is
                          # DATE_BEFORE,
                          # DATE_AFTER,
                          # DATE_ON_OR_BEFORE or
                          # DATE_ON_OR_AFTER.
                          #
                          # Relative dates are not supported in data validation.
                          # They are supported only in conditional formatting and
                          # conditional filters.
                      &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                          # The value is parsed as if the user typed into a cell.
                          # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                    },
                  ],
                  &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                },
                &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                    # are shown. Mutually exclusive with visible_background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                    # shown. This field is mutually exclusive with visible_foreground_color,
                    # and must be set to an RGB-type color. If visible_background_color is
                    # also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                    # are shown. This field is mutually exclusive with
                    # visible_background_color, and must be set to an RGB-type color. If
                    # visible_foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;hiddenValues&quot;: [ # Values that should be hidden.
                  &quot;A String&quot;,
                ],
              },
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this filter view is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
            &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
                # are equal in the earlier specifications.
              { # A sort order associated with a specific column or row.
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                    # to the top. Mutually exclusive with foreground_color, and must be an
                    # RGB-type color. If background_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
                &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color, and must
                    # be an RGB-type color. If foreground_color is also set, this field takes
                    # precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                    # sorted to the top. Mutually exclusive with background_color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            ],
            &quot;title&quot;: &quot;A String&quot;, # The name of the filter view.
            &quot;range&quot;: { # A range on a sheet. # The range this filter view covers.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;filterViewId&quot;: 42, # The ID of the filter view.
          },
        ],
        &quot;charts&quot;: [ # The specifications of every chart on this sheet.
          { # A chart embedded in a sheet.
            &quot;spec&quot;: { # The specifications of a chart. # The specification of the chart.
              &quot;candlestickChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/candlestickchart&quot;&gt;candlestick # A candlestick chart specification.
                  # chart&lt;/a&gt;.
                &quot;data&quot;: [ # The Candlestick chart data.
                    # Only one CandlestickData is supported.
                  { # The Candlestick chart data, each containing the low, open, close, and high
                      # values for a series.
                    &quot;openSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the open/initial value for each
                        # candle. This is the bottom of the candle body.  If less than the close
                        # value the candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;highSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the high/maximum value for each
                        # candle. This is the top of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;closeSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the close/final value for each candle.
                        # This is the top of the candle body.  If greater than the open value the
                        # candle will be filled.  Otherwise the candle will be hollow.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                    &quot;lowSeries&quot;: { # The series of a CandlestickData. # The range data (vertical axis) for the low/minimum value for each candle.
                        # This is the bottom of the candle&#x27;s center line.
                      &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickSeries.
                        &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                          &quot;sources&quot;: [ # The ranges of data for a series or domain.
                              # Exactly one dimension must have a length of 1,
                              # and all sources in the list must have the same dimension
                              # with length 1.
                              # The domain (if it exists) &amp; all series must have the same number
                              # of source ranges. If using more than one source range, then the source
                              # range at a given offset must be in order and contiguous across the domain
                              # and series.
                              #
                              # For example, these are valid configurations:
                              #
                              #     domain sources: A1:A5
                              #     series1 sources: B1:B5
                              #     series2 sources: D6:D10
                              #
                              #     domain sources: A1:A5, C10:C12
                              #     series1 sources: B1:B5, D10:D12
                              #     series2 sources: C1:C5, E10:E12
                            { # A range on a sheet.
                                # All indexes are zero-based.
                                # Indexes are half open, e.g the start index is inclusive
                                # and the end index is exclusive -- [start_index, end_index).
                                # Missing indexes indicate the range is unbounded on that side.
                                #
                                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                                #
                                #   `Sheet1!A1:A1 == sheet_id: 0,
                                #                   start_row_index: 0, end_row_index: 1,
                                #                   start_column_index: 0, end_column_index: 1`
                                #
                                #   `Sheet1!A3:B4 == sheet_id: 0,
                                #                   start_row_index: 2, end_row_index: 4,
                                #                   start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A:B == sheet_id: 0,
                                #                 start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1!A5:B == sheet_id: 0,
                                #                  start_row_index: 4,
                                #                  start_column_index: 0, end_column_index: 2`
                                #
                                #   `Sheet1 == sheet_id:0`
                                #
                                # The start index must always be less than or equal to the end index.
                                # If the start index equals the end index, then the range is empty.
                                # Empty ranges are typically not meaningful and are usually rendered in the
                                # UI as `#REF!`.
                              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                              &quot;sheetId&quot;: 42, # The sheet this range is on.
                              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                            },
                          ],
                        },
                      },
                    },
                  },
                ],
                &quot;domain&quot;: { # The domain of a CandlestickChart. # The domain data (horizontal axis) for the candlestick chart.  String data
                    # will be treated as discrete labels, other data will be treated as
                    # continuous values.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the CandlestickDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
              },
              &quot;histogramChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/histogram&quot;&gt;histogram chart&lt;/a&gt;. # A histogram chart specification.
                  # A histogram chart groups data items into bins, displaying each bin as a
                  # column of stacked items.  Histograms are used to display the distribution
                  # of a dataset.  Each column of items represents a range into which those
                  # items fall.  The number of bins can be chosen automatically or specified
                  # explicitly.
                &quot;showItemDividers&quot;: True or False, # Whether horizontal divider lines should be displayed between items in each
                    # column.
                &quot;series&quot;: [ # The series for a histogram may be either a single series of values to be
                    # bucketed or multiple series, each of the same length, containing the name
                    # of the series followed by the values to be bucketed for that series.
                  { # A histogram series containing the series color and data.
                    &quot;barColorStyle&quot;: { # A color value. # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # If bar_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;data&quot;: { # The data included in a domain or series. # The data for this histogram series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;barColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column representing this series in each bucket.
                        # This field is optional.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;bucketSize&quot;: 3.14, # By default the bucket size (the range of values stacked in a single
                    # column) is chosen automatically, but it may be overridden here.
                    # E.g., A bucket size of 1.5 results in buckets from 0 - 1.5, 1.5 - 3.0, etc.
                    # Cannot be negative.
                    # This field is optional.
                &quot;outlierPercentile&quot;: 3.14, # The outlier percentile is used to ensure that outliers do not adversely
                    # affect the calculation of bucket sizes.  For example, setting an outlier
                    # percentile of 0.05 indicates that the top and bottom 5% of values when
                    # calculating buckets.  The values are still included in the chart, they will
                    # be added to the first or last buckets instead of their own buckets.
                    # Must be between 0.0 and 0.5.
              },
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;treemapChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/treemap&quot;&gt;Treemap chart&lt;/a&gt;. # A treemap chart specification.
                &quot;hintedLevels&quot;: 42, # The number of additional data levels beyond the labeled levels to be shown
                    # on the treemap chart. These levels are not interactive and are shown
                    # without their labels. Defaults to 0 if not specified.
                &quot;levels&quot;: 42, # The number of data levels to show on the treemap chart. These levels are
                    # interactive and are shown with their labels. Defaults to 2 if not
                    # specified.
                &quot;hideTooltips&quot;: True or False, # True to hide tooltips.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The text format for all labels on the chart.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;colorScale&quot;: { # A color scale for a treemap chart. # The color scale for data cells in the treemap chart. Data cells are
                    # assigned colors based on their color values. These color values come from
                    # color_data, or from size_data if color_data is not specified.
                    # Cells with color values less than or equal to min_value will
                    # have minValueColor as their
                    # background color. Cells with color values greater than or equal to
                    # max_value will have
                    # maxValueColor as their background
                    # color. Cells with color values between min_value and max_value will
                    # have background colors on a gradient between
                    # minValueColor and
                    # maxValueColor, the midpoint of
                    # the gradient being midValueColor.
                    # Cells with missing or non-numeric color values will have
                    # noDataColor as their background
                    # color.
                  &quot;noDataColorStyle&quot;: { # A color value. # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # If no_data_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;minValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;minValueColorStyle&quot;: { # A color value. # The background color for cells with a color value less than or equal to
                      # minValue. Defaults to #dc3912 if not
                      # specified.
                      # If min_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;midValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;noDataColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells that have no color data associated with
                      # them. Defaults to #000000 if not specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;maxValueColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;midValueColorStyle&quot;: { # A color value. # The background color for cells with a color value at the midpoint between
                      # minValue and
                      # maxValue. Defaults to #efe6dc if not
                      # specified.
                      # If mid_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;maxValueColorStyle&quot;: { # A color value. # The background color for cells with a color value greater than or equal
                      # to maxValue. Defaults to #109618 if not
                      # specified.
                      # If max_value_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                },
                &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color for header cells.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;headerColorStyle&quot;: { # A color value. # The background color for header cells.
                    # If header_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;minValue&quot;: 3.14, # The minimum possible data value. Cells with values less than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual minimum value from color_data, or the minimum value from
                    # size_data if color_data is not specified.
                &quot;maxValue&quot;: 3.14, # The maximum possible data value. Cells with values greater than this will
                    # have the same color as cells with this value. If not specified, defaults
                    # to the actual maximum value from color_data, or the maximum value from
                    # size_data if color_data is not specified.
                &quot;colorData&quot;: { # The data included in a domain or series. # The data that determines the background color of each treemap data cell.
                    # This field is optional. If not specified, size_data is used to
                    # determine background colors. If specified, the data is expected to be
                    # numeric. color_scale will determine how the values in this data map to
                    # data cell background colors.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;labels&quot;: { # The data included in a domain or series. # The data that contains the treemap cell labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data the contains the treemap cells&#x27; parent labels.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;sizeData&quot;: { # The data included in a domain or series. # The data that determines the size of each treemap data cell. This data is
                    # expected to be numeric. The cells corresponding to non-numeric or missing
                    # data will not be rendered. If color_data is not specified, this data
                    # is used to determine data cell background colors as well.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;basicChart&quot;: { # The specification for a basic chart.  See BasicChartType for the list # A basic chart specification, can be one of many kinds of charts.
                  # See BasicChartType for the list of all
                  # charts this supports.
                  # of charts this supports.
                &quot;series&quot;: [ # The data this chart is visualizing.
                  { # A single series of data in a chart.
                      # For example, if charting stock prices over time, multiple series may exist,
                      # one for the &quot;Open Price&quot;, &quot;High Price&quot;, &quot;Low Price&quot; and &quot;Close Price&quot;.
                    &quot;series&quot;: { # The data included in a domain or series. # The data being visualized in this chart series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;lineStyle&quot;: { # Properties that describe the style of a line. # The line style of this series. Valid only if the
                        # chartType is AREA,
                        # LINE, or SCATTER.
                        # COMBO charts are also supported if the
                        # series chart type is
                        # AREA or LINE.
                      &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                      &quot;width&quot;: 42, # The thickness of the line, in px.
                    },
                    &quot;colorStyle&quot;: { # A color value. # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;targetAxis&quot;: &quot;A String&quot;, # The minor axis that will specify the range of values for this series.
                        # For example, if charting stocks over time, the &quot;Volume&quot; series
                        # may want to be pinned to the right with the prices pinned to the left,
                        # because the scale of trading volume is different than the scale of
                        # prices.
                        # It is an error to specify an axis that isn&#x27;t a valid minor axis
                        # for the chart&#x27;s type.
                    &quot;type&quot;: &quot;A String&quot;, # The type of this series. Valid only if the
                        # chartType is
                        # COMBO.
                        # Different types will change the way the series is visualized.
                        # Only LINE, AREA,
                        # and COLUMN are supported.
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color for elements (such as bars, lines, and points) associated with
                        # this series.  If empty, a default color is used.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                ],
                &quot;legendPosition&quot;: &quot;A String&quot;, # The position of the chart legend.
                &quot;threeDimensional&quot;: True or False, # True to make the chart 3D.
                    # Applies to Bar and Column charts.
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type for charts that support vertical stacking.
                    # Applies to Area, Bar, Column, Combo, and Stepped Area charts.
                &quot;domains&quot;: [ # The domain of data this is charting.
                    # Only a single domain is supported.
                  { # The domain of a chart.
                      # For example, if charting stock prices over time, this would be the date.
                    &quot;domain&quot;: { # The data included in a domain or series. # The data of the domain. For example, if charting stock prices over time,
                        # this is the data representing the dates.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  },
                ],
                &quot;lineSmoothing&quot;: True or False, # Gets whether all lines should be rendered smooth or straight by default.
                    # Applies to Line charts.
                &quot;headerCount&quot;: 42, # The number of rows or columns in the data that are &quot;headers&quot;.
                    # If not set, Google Sheets will guess how many rows are headers based
                    # on the data.
                    #
                    # (Note that BasicChartAxis.title may override the axis title
                    #  inferred from the header values.)
                &quot;compareMode&quot;: &quot;A String&quot;, # The behavior of tooltips and data highlighting when hovering on data and
                    # chart area.
                &quot;axis&quot;: [ # The axis on the chart.
                  { # An axis of the chart.
                      # A chart may not have more than one axis per
                      # axis position.
                    &quot;title&quot;: &quot;A String&quot;, # The title of this axis. If set, this overrides any title inferred
                        # from headers of the data.
                    &quot;position&quot;: &quot;A String&quot;, # The position of this axis.
                    &quot;format&quot;: { # The format of a run of text in a cell. # The format of the title.
                        # Only valid if the axis is not associated with the domain.
                        # Absent values indicate that the field isn&#x27;t specified.
                      &quot;fontSize&quot;: 42, # The size of the font.
                      &quot;underline&quot;: True or False, # True if the text is underlined.
                      &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                          # If foreground_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;bold&quot;: True or False, # True if the text is bold.
                      &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;italic&quot;: True or False, # True if the text is italicized.
                      &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                      &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                    },
                    &quot;titleTextPosition&quot;: { # Position settings for text. # The axis title text position.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                    },
                    &quot;viewWindowOptions&quot;: { # The options that define a &quot;view window&quot; for a chart (such as the visible # The view window options for this axis.
                        # values in an axis).
                      &quot;viewWindowMin&quot;: 3.14, # The minimum numeric value to be shown in this view window. If unset, will
                          # automatically determine a minimum value that looks good for the data.
                      &quot;viewWindowMode&quot;: &quot;A String&quot;, # The view window&#x27;s mode.
                      &quot;viewWindowMax&quot;: 3.14, # The maximum numeric value to be shown in this view window. If unset, will
                          # automatically determine a maximum value that looks good for the data.
                    },
                  },
                ],
                &quot;chartType&quot;: &quot;A String&quot;, # The type of the chart.
                &quot;interpolateNulls&quot;: True or False, # If some values in a series are missing, gaps may appear in the chart (e.g,
                    # segments of lines in a line chart will be missing).  To eliminate these
                    # gaps set this to true.
                    # Applies to Line, Area, and Combo charts.
              },
              &quot;subtitle&quot;: &quot;A String&quot;, # The subtitle of the chart.
              &quot;waterfallChart&quot;: { # A waterfall chart. # A waterfall chart specification.
                &quot;domain&quot;: { # The domain of a waterfall chart. # The domain data (horizontal axis) for the waterfall chart.
                  &quot;reversed&quot;: True or False, # True to reverse the order of the domain values (horizontal axis).
                  &quot;data&quot;: { # The data included in a domain or series. # The data of the WaterfallChartDomain.
                    &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                      &quot;sources&quot;: [ # The ranges of data for a series or domain.
                          # Exactly one dimension must have a length of 1,
                          # and all sources in the list must have the same dimension
                          # with length 1.
                          # The domain (if it exists) &amp; all series must have the same number
                          # of source ranges. If using more than one source range, then the source
                          # range at a given offset must be in order and contiguous across the domain
                          # and series.
                          #
                          # For example, these are valid configurations:
                          #
                          #     domain sources: A1:A5
                          #     series1 sources: B1:B5
                          #     series2 sources: D6:D10
                          #
                          #     domain sources: A1:A5, C10:C12
                          #     series1 sources: B1:B5, D10:D12
                          #     series2 sources: C1:C5, E10:E12
                        { # A range on a sheet.
                            # All indexes are zero-based.
                            # Indexes are half open, e.g the start index is inclusive
                            # and the end index is exclusive -- [start_index, end_index).
                            # Missing indexes indicate the range is unbounded on that side.
                            #
                            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                            #
                            #   `Sheet1!A1:A1 == sheet_id: 0,
                            #                   start_row_index: 0, end_row_index: 1,
                            #                   start_column_index: 0, end_column_index: 1`
                            #
                            #   `Sheet1!A3:B4 == sheet_id: 0,
                            #                   start_row_index: 2, end_row_index: 4,
                            #                   start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A:B == sheet_id: 0,
                            #                 start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1!A5:B == sheet_id: 0,
                            #                  start_row_index: 4,
                            #                  start_column_index: 0, end_column_index: 2`
                            #
                            #   `Sheet1 == sheet_id:0`
                            #
                            # The start index must always be less than or equal to the end index.
                            # If the start index equals the end index, then the range is empty.
                            # Empty ranges are typically not meaningful and are usually rendered in the
                            # UI as `#REF!`.
                          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                          &quot;sheetId&quot;: 42, # The sheet this range is on.
                          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                        },
                      ],
                    },
                  },
                },
                &quot;stackedType&quot;: &quot;A String&quot;, # The stacked type.
                &quot;firstValueIsTotal&quot;: True or False, # True to interpret the first value as a total.
                &quot;connectorLineStyle&quot;: { # Properties that describe the style of a line. # The line style for the connector lines.
                  &quot;type&quot;: &quot;A String&quot;, # The dash type of the line.
                  &quot;width&quot;: 42, # The thickness of the line, in px.
                },
                &quot;series&quot;: [ # The data this waterfall chart is visualizing.
                  { # A single series of data for a waterfall chart.
                    &quot;customSubtotals&quot;: [ # Custom subtotal columns appearing in this series. The order in which
                        # subtotals are defined is not significant. Only one subtotal may be
                        # defined for each data point.
                      { # A custom subtotal column for a waterfall chart series.
                        &quot;subtotalIndex&quot;: 42, # The 0-based index of a data point within the series. If
                            # data_is_subtotal is true, the data point at this index is the
                            # subtotal. Otherwise, the subtotal appears after the data point with
                            # this index. A series can have multiple subtotals at arbitrary indices,
                            # but subtotals do not affect the indices of the data points. For
                            # example, if a series has three data points, their indices will always
                            # be 0, 1, and 2, regardless of how many subtotals exist on the series or
                            # what data points they are associated with.
                        &quot;dataIsSubtotal&quot;: True or False, # True if the data point at subtotal_index is the subtotal. If false,
                            # the subtotal will be computed and appear after the data point.
                        &quot;label&quot;: &quot;A String&quot;, # A label for the subtotal column.
                      },
                    ],
                    &quot;hideTrailingSubtotal&quot;: True or False, # True to hide the subtotal column from the end of the series. By default,
                        # a subtotal column will appear at the end of each series. Setting this
                        # field to true will hide that subtotal column for this series.
                    &quot;data&quot;: { # The data included in a domain or series. # The data being visualized in this series.
                      &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                        &quot;sources&quot;: [ # The ranges of data for a series or domain.
                            # Exactly one dimension must have a length of 1,
                            # and all sources in the list must have the same dimension
                            # with length 1.
                            # The domain (if it exists) &amp; all series must have the same number
                            # of source ranges. If using more than one source range, then the source
                            # range at a given offset must be in order and contiguous across the domain
                            # and series.
                            #
                            # For example, these are valid configurations:
                            #
                            #     domain sources: A1:A5
                            #     series1 sources: B1:B5
                            #     series2 sources: D6:D10
                            #
                            #     domain sources: A1:A5, C10:C12
                            #     series1 sources: B1:B5, D10:D12
                            #     series2 sources: C1:C5, E10:E12
                          { # A range on a sheet.
                              # All indexes are zero-based.
                              # Indexes are half open, e.g the start index is inclusive
                              # and the end index is exclusive -- [start_index, end_index).
                              # Missing indexes indicate the range is unbounded on that side.
                              #
                              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                              #
                              #   `Sheet1!A1:A1 == sheet_id: 0,
                              #                   start_row_index: 0, end_row_index: 1,
                              #                   start_column_index: 0, end_column_index: 1`
                              #
                              #   `Sheet1!A3:B4 == sheet_id: 0,
                              #                   start_row_index: 2, end_row_index: 4,
                              #                   start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A:B == sheet_id: 0,
                              #                 start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1!A5:B == sheet_id: 0,
                              #                  start_row_index: 4,
                              #                  start_column_index: 0, end_column_index: 2`
                              #
                              #   `Sheet1 == sheet_id:0`
                              #
                              # The start index must always be less than or equal to the end index.
                              # If the start index equals the end index, then the range is empty.
                              # Empty ranges are typically not meaningful and are usually rendered in the
                              # UI as `#REF!`.
                            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                            &quot;sheetId&quot;: 42, # The sheet this range is on.
                            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                          },
                        ],
                      },
                    },
                    &quot;positiveColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with positive values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;negativeColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all columns in this series with negative values.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                    &quot;subtotalColumnsStyle&quot;: { # Styles for a waterfall chart column. # Styles for all subtotal columns in this series.
                      &quot;colorStyle&quot;: { # A color value. # The color of the column.
                          # If color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the column.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                      &quot;label&quot;: &quot;A String&quot;, # The label of the column&#x27;s legend.
                    },
                  },
                ],
                &quot;hideConnectorLines&quot;: True or False, # True to hide connector lines between columns.
              },
              &quot;subtitleTextFormat&quot;: { # The format of a run of text in a cell. # The subtitle text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;orgChart&quot;: { # An &lt;a href=&quot;/chart/interactive/docs/gallery/orgchart&quot;&gt;org chart&lt;/a&gt;. # An org chart specification.
                  # Org charts require a unique set of labels in labels and may
                  # optionally include parent_labels and tooltips.
                  # parent_labels contain, for each node, the label identifying the parent
                  # node.  tooltips contain, for each node, an optional tooltip.
                  #
                  # For example, to describe an OrgChart with Alice as the CEO, Bob as the
                  # President (reporting to Alice) and Cathy as VP of Sales (also reporting to
                  # Alice), have labels contain &quot;Alice&quot;, &quot;Bob&quot;, &quot;Cathy&quot;,
                  # parent_labels contain &quot;&quot;, &quot;Alice&quot;, &quot;Alice&quot; and tooltips contain
                  # &quot;CEO&quot;, &quot;President&quot;, &quot;VP Sales&quot;.
                &quot;parentLabels&quot;: { # The data included in a domain or series. # The data containing the label of the parent for the corresponding node.
                    # A blank value indicates that the node has no parent and is a top-level
                    # node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;selectedNodeColorStyle&quot;: { # A color value. # The color of the selected org chart nodes.
                    # If selected_node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;nodeColorStyle&quot;: { # A color value. # The color of the org chart nodes.
                    # If node_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;selectedNodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the selected org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;tooltips&quot;: { # The data included in a domain or series. # The data containing the tooltip for the corresponding node.  A blank value
                    # results in no tooltip being displayed for the node.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;nodeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the org chart nodes.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;nodeSize&quot;: &quot;A String&quot;, # The size of the org chart nodes.
                &quot;labels&quot;: { # The data included in a domain or series. # The data containing the labels for all the nodes in the chart.  Labels
                    # must be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;pieChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/piechart&quot;&gt;pie chart&lt;/a&gt;. # A pie chart specification.
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the pie chart should be drawn.
                &quot;series&quot;: { # The data included in a domain or series. # The data that covers the one and only series of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;threeDimensional&quot;: True or False, # True if the pie is three dimensional.
                &quot;pieHole&quot;: 3.14, # The size of the hole in the pie chart.
                &quot;domain&quot;: { # The data included in a domain or series. # The data that covers the domain of the pie chart.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
              },
              &quot;altText&quot;: &quot;A String&quot;, # The alternative text that describes the chart.  This is often used
                  # for accessibility.
              &quot;subtitleTextPosition&quot;: { # Position settings for text. # The subtitle text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;fontName&quot;: &quot;A String&quot;, # The name of the font to use by default for all chart text (e.g. title,
                  # axis labels, legend).  If a font is specified for a specific part of the
                  # chart it will override this font name.
              &quot;titleTextFormat&quot;: { # The format of a run of text in a cell. # The title text format.
                  # Strikethrough and underline are not supported.
                  # Absent values indicate that the field isn&#x27;t specified.
                &quot;fontSize&quot;: 42, # The size of the font.
                &quot;underline&quot;: True or False, # True if the text is underlined.
                &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                    # If foreground_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;bold&quot;: True or False, # True if the text is bold.
                &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;italic&quot;: True or False, # True if the text is italicized.
                &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
              },
              &quot;maximized&quot;: True or False, # True to make a chart fill the entire space in which it&#x27;s rendered with
                  # minimum padding.  False to use the default padding.
                  # (Not applicable to Geo and Org charts.)
              &quot;titleTextPosition&quot;: { # Position settings for text. # The title text position.
                  # This field is optional.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
              },
              &quot;scorecardChart&quot;: { # A scorecard chart. Scorecard charts are used to highlight key performance # A scorecard chart specification.
                  # indicators, known as KPIs, on the spreadsheet. A scorecard chart can
                  # represent things like total sales, average cost, or a top selling item. You
                  # can specify a single data value, or aggregate over a range of data.
                  # Percentage or absolute difference from a baseline value can be highlighted,
                  # like changes over time.
                &quot;aggregateType&quot;: &quot;A String&quot;, # The aggregation type for key and baseline chart data in scorecard chart.
                    # This field is optional.
                &quot;numberFormatSource&quot;: &quot;A String&quot;, # The number format source used in the scorecard chart.
                    # This field is optional.
                &quot;scaleFactor&quot;: 3.14, # Value to scale scorecard key and baseline value. For example, a factor of
                    # 10 can be used to divide all values in the chart by 10.
                    # This field is optional.
                &quot;keyValueData&quot;: { # The data included in a domain or series. # The data for scorecard key value.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueData&quot;: { # The data included in a domain or series. # The data for scorecard baseline value.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;baselineValueFormat&quot;: { # Formatting options for baseline value. # Formatting options for baseline value.
                    # This field is needed only if baseline_value_data is specified.
                  &quot;comparisonType&quot;: &quot;A String&quot;, # The comparison type of key value with baseline value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for baseline value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;description&quot;: &quot;A String&quot;, # Description which is appended after the baseline value.
                      # This field is optional.
                  &quot;positiveColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # If positive_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;negativeColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;negativeColorStyle&quot;: { # A color value. # Color to be used, in case baseline value represents a negative change for
                      # key value. This field is optional.
                      # If negative_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of baseline value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                  &quot;positiveColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # Color to be used, in case baseline value represents a positive change for
                      # key value. This field is optional.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;keyValueFormat&quot;: { # Formatting options for key value. # Formatting options for key value.
                  &quot;textFormat&quot;: { # The format of a run of text in a cell. # Text formatting options for key value.
                      # Absent values indicate that the field isn&#x27;t specified.
                    &quot;fontSize&quot;: 42, # The size of the font.
                    &quot;underline&quot;: True or False, # True if the text is underlined.
                    &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                        # If foreground_color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;bold&quot;: True or False, # True if the text is bold.
                    &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;italic&quot;: True or False, # True if the text is italicized.
                    &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                    &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                  },
                  &quot;position&quot;: { # Position settings for text. # Specifies the horizontal text positioning of key value.
                      # This field is optional. If not specified, default positioning is used.
                    &quot;horizontalAlignment&quot;: &quot;A String&quot;, # Horizontal alignment setting for the piece of text.
                  },
                },
                &quot;customFormatOptions&quot;: { # Custom number formatting options for chart attributes. # Custom formatting options for numeric key/baseline values in scorecard
                    # chart. This field is used only when number_format_source is set to
                    # CUSTOM. This field is optional.
                  &quot;suffix&quot;: &quot;A String&quot;, # Custom suffix to be appended to the chart attribute.
                      # This field is optional.
                  &quot;prefix&quot;: &quot;A String&quot;, # Custom prefix to be prepended to the chart attribute.
                      # This field is optional.
                },
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the entire chart.
                  # Not applicable to Org charts.
                  # If background_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;title&quot;: &quot;A String&quot;, # The title of the chart.
              &quot;hiddenDimensionStrategy&quot;: &quot;A String&quot;, # Determines how the charts will use hidden rows or columns.
              &quot;bubbleChart&quot;: { # A &lt;a href=&quot;/chart/interactive/docs/gallery/bubblechart&quot;&gt;bubble chart&lt;/a&gt;. # A bubble chart specification.
                &quot;bubbleOpacity&quot;: 3.14, # The opacity of the bubbles between 0 and 1.0.
                    # 0 is fully transparent and 1 is fully opaque.
                &quot;bubbleSizes&quot;: { # The data included in a domain or series. # The data contianing the bubble sizes.  Bubble sizes are used to draw
                    # the bubbles at different sizes relative to each other.
                    # If specified, group_ids must also be specified.  This field is
                    # optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleMinRadiusSize&quot;: 42, # The minimum radius size of the bubbles, in pixels.
                    # If specific, the field must be a positive value.
                &quot;bubbleBorderColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The bubble border color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;bubbleMaxRadiusSize&quot;: 42, # The max radius size of the bubbles, in pixels.
                    # If specified, the field must be a positive value.
                &quot;bubbleBorderColorStyle&quot;: { # A color value. # The bubble border color.
                    # If bubble_border_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;groupIds&quot;: { # The data included in a domain or series. # The data containing the bubble group IDs. All bubbles with the same group
                    # ID are drawn in the same color. If bubble_sizes is specified then
                    # this field must also be specified but may contain blank values.
                    # This field is optional.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;series&quot;: { # The data included in a domain or series. # The data contianing the bubble y-values.  These values locate the bubbles
                    # in the chart vertically.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleLabels&quot;: { # The data included in a domain or series. # The data containing the bubble labels.  These do not need to be unique.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;legendPosition&quot;: &quot;A String&quot;, # Where the legend of the chart should be drawn.
                &quot;domain&quot;: { # The data included in a domain or series. # The data containing the bubble x-values.  These values locate the bubbles
                    # in the chart horizontally.
                  &quot;sourceRange&quot;: { # Source ranges for a chart. # The source ranges of the data.
                    &quot;sources&quot;: [ # The ranges of data for a series or domain.
                        # Exactly one dimension must have a length of 1,
                        # and all sources in the list must have the same dimension
                        # with length 1.
                        # The domain (if it exists) &amp; all series must have the same number
                        # of source ranges. If using more than one source range, then the source
                        # range at a given offset must be in order and contiguous across the domain
                        # and series.
                        #
                        # For example, these are valid configurations:
                        #
                        #     domain sources: A1:A5
                        #     series1 sources: B1:B5
                        #     series2 sources: D6:D10
                        #
                        #     domain sources: A1:A5, C10:C12
                        #     series1 sources: B1:B5, D10:D12
                        #     series2 sources: C1:C5, E10:E12
                      { # A range on a sheet.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                    ],
                  },
                },
                &quot;bubbleTextStyle&quot;: { # The format of a run of text in a cell. # The format of the text inside the bubbles.
                    # Underline and Strikethrough are not supported.
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
              },
            },
            &quot;chartId&quot;: 42, # The ID of the chart.
            &quot;position&quot;: { # The position of an embedded object such as a chart. # The position of the chart.
              &quot;overlayPosition&quot;: { # The location an object is overlaid on top of a grid. # The position at which the object is overlaid on top of a grid.
                &quot;anchorCell&quot;: { # A coordinate in a sheet. # The cell the object is anchored to.
                    # All indexes are zero-based.
                  &quot;columnIndex&quot;: 42, # The column index of the coordinate.
                  &quot;rowIndex&quot;: 42, # The row index of the coordinate.
                  &quot;sheetId&quot;: 42, # The sheet this coordinate is on.
                },
                &quot;widthPixels&quot;: 42, # The width of the object, in pixels. Defaults to 600.
                &quot;offsetYPixels&quot;: 42, # The vertical offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;offsetXPixels&quot;: 42, # The horizontal offset, in pixels, that the object is offset
                    # from the anchor cell.
                &quot;heightPixels&quot;: 42, # The height of the object, in pixels. Defaults to 371.
              },
              &quot;newSheet&quot;: True or False, # If true, the embedded object is put on a new sheet whose ID
                  # is chosen for you. Used only when writing.
              &quot;sheetId&quot;: 42, # The sheet this is on. Set only if the embedded object
                  # is on its own sheet. Must be non-negative.
            },
          },
        ],
        &quot;protectedRanges&quot;: [ # The protected ranges in this sheet.
          { # A protected range.
            &quot;unprotectedRanges&quot;: [ # The list of unprotected ranges within a protected sheet.
                # Unprotected ranges are only supported on protected sheets.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;requestingUserCanEdit&quot;: True or False, # True if the user who requested this protected range can edit the
                # protected area.
                # This field is read-only.
            &quot;protectedRangeId&quot;: 42, # The ID of the protected range.
                # This field is read-only.
            &quot;description&quot;: &quot;A String&quot;, # The description of this protected range.
            &quot;range&quot;: { # A range on a sheet. # The range that is being protected.
                # The range may be fully unbounded, in which case this is considered
                # a protected sheet.
                #
                # When writing, only one of range or named_range_id
                # may be set.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
            &quot;warningOnly&quot;: True or False, # True if this protected range will show a warning when editing.
                # Warning-based protection means that every user can edit data in the
                # protected range, except editing will prompt a warning asking the user
                # to confirm the edit.
                #
                # When writing: if this field is true, then editors is ignored.
                # Additionally, if this field is changed from true to false and the
                # `editors` field is not set (nor included in the field mask), then
                # the editors will be set to all the editors in the document.
            &quot;editors&quot;: { # The editors of a protected range. # The users and groups with edit access to the protected range.
                # This field is only visible to users with edit access to the protected
                # range and the document.
                # Editors are not supported with warning_only protection.
              &quot;groups&quot;: [ # The email addresses of groups with edit access to the protected range.
                &quot;A String&quot;,
              ],
              &quot;domainUsersCanEdit&quot;: True or False, # True if anyone in the document&#x27;s domain has edit access to the protected
                  # range.  Domain protection is only supported on documents within a domain.
              &quot;users&quot;: [ # The email addresses of users with edit access to the protected range.
                &quot;A String&quot;,
              ],
            },
            &quot;namedRangeId&quot;: &quot;A String&quot;, # The named range this protected range is backed by, if any.
                #
                # When writing, only one of range or named_range_id
                # may be set.
          },
        ],
        &quot;basicFilter&quot;: { # The default filter associated with a sheet. # The filter on this sheet, if any.
          &quot;criteria&quot;: { # The criteria for showing/hiding values per column.
              # The map&#x27;s key is the column index, and the value is the criteria for
              # that column.
            &quot;a_key&quot;: { # Criteria for showing/hiding rows in a filter or filter view.
              &quot;visibleBackgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to filter by; only cells with this fill color are
                  # shown. Mutually exclusive with visible_foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # A condition that must be true for values to be shown.
                  # (This does not override hidden_values -- if a value is listed there,
                  #  it will still be hidden.)
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;visibleForegroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to filter by; only cells with this foreground color
                  # are shown. Mutually exclusive with visible_background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;visibleBackgroundColorStyle&quot;: { # A color value. # The background fill color to filter by; only cells with this fill color are
                  # shown. This field is mutually exclusive with visible_foreground_color,
                  # and must be set to an RGB-type color. If visible_background_color is
                  # also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;visibleForegroundColorStyle&quot;: { # A color value. # The foreground color to filter by; only cells with this foreground color
                  # are shown. This field is mutually exclusive with
                  # visible_background_color, and must be set to an RGB-type color. If
                  # visible_foreground_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;hiddenValues&quot;: [ # Values that should be hidden.
                &quot;A String&quot;,
              ],
            },
          },
          &quot;range&quot;: { # A range on a sheet. # The range the filter covers.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
          &quot;sortSpecs&quot;: [ # The sort order per column. Later specifications are used when values
              # are equal in the earlier specifications.
            { # A sort order associated with a specific column or row.
              &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;backgroundColorStyle&quot;: { # A color value. # The background fill color to sort by; cells with this fill color are sorted
                  # to the top. Mutually exclusive with foreground_color, and must be an
                  # RGB-type color. If background_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;sortOrder&quot;: &quot;A String&quot;, # The order data should be sorted.
              &quot;dimensionIndex&quot;: 42, # The dimension the sort should be applied to.
              &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color, and must
                  # be an RGB-type color. If foreground_color is also set, this field takes
                  # precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color to sort by; cells with this foreground color are
                  # sorted to the top. Mutually exclusive with background_color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          ],
        },
        &quot;merges&quot;: [ # The ranges that are merged together.
          { # A range on a sheet.
              # All indexes are zero-based.
              # Indexes are half open, e.g the start index is inclusive
              # and the end index is exclusive -- [start_index, end_index).
              # Missing indexes indicate the range is unbounded on that side.
              #
              # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
              #
              #   `Sheet1!A1:A1 == sheet_id: 0,
              #                   start_row_index: 0, end_row_index: 1,
              #                   start_column_index: 0, end_column_index: 1`
              #
              #   `Sheet1!A3:B4 == sheet_id: 0,
              #                   start_row_index: 2, end_row_index: 4,
              #                   start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A:B == sheet_id: 0,
              #                 start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1!A5:B == sheet_id: 0,
              #                  start_row_index: 4,
              #                  start_column_index: 0, end_column_index: 2`
              #
              #   `Sheet1 == sheet_id:0`
              #
              # The start index must always be less than or equal to the end index.
              # If the start index equals the end index, then the range is empty.
              # Empty ranges are typically not meaningful and are usually rendered in the
              # UI as `#REF!`.
            &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
            &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
            &quot;sheetId&quot;: 42, # The sheet this range is on.
            &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
            &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
          },
        ],
        &quot;bandedRanges&quot;: [ # The banded (alternating colors) ranges on this sheet.
          { # A banded (alternating colors) range in a sheet.
            &quot;columnProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for column bands. These properties are applied on a column-
                # by-column basis throughout all the columns in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;bandedRangeId&quot;: 42, # The id of the banded range.
            &quot;rowProperties&quot;: { # Properties referring a single dimension (either row or column). If both # Properties for row bands. These properties are applied on a row-by-row
                # basis throughout all the rows in the range. At least one of
                # row_properties or column_properties must be specified.
                # BandedRange.row_properties and BandedRange.column_properties are
                # set, the fill colors are applied to cells according to the following rules:
                #
                # * header_color and footer_color take priority over band colors.
                # * first_band_color takes priority over second_band_color.
                # * row_properties takes priority over column_properties.
                #
                # For example, the first row color takes priority over the first column
                # color, but the first column color takes priority over the second row color.
                # Similarly, the row header takes priority over the column header in the
                # top left cell, but the column header takes priority over the first row
                # color if the row header is not set.
              &quot;firstBandColorStyle&quot;: { # A color value. # The first color that is alternating. (Required)
                  # If first_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;secondBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The second color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;headerColorStyle&quot;: { # A color value. # The color of the first row or column. If this field is set, the first row
                  # or column is filled with this color and the colors alternate between
                  # first_band_color and second_band_color starting from the second
                  # row or column. Otherwise, the first row or column is filled with
                  # first_band_color and the colors proceed to alternate as they normally
                  # would. If header_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;firstBandColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The first color that is alternating. (Required)
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;secondBandColorStyle&quot;: { # A color value. # The second color that is alternating. (Required)
                  # If second_band_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
              &quot;footerColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
              &quot;footerColorStyle&quot;: { # A color value. # The color of the last row or column. If this field is not set, the last
                  # row or column is filled with either first_band_color or
                  # second_band_color, depending on the color of the previous row or
                  # column.
                  # If footer_color is also set, this field takes precedence.
                &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;range&quot;: { # A range on a sheet. # The range over which these properties are applied.
                # All indexes are zero-based.
                # Indexes are half open, e.g the start index is inclusive
                # and the end index is exclusive -- [start_index, end_index).
                # Missing indexes indicate the range is unbounded on that side.
                #
                # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                #
                #   `Sheet1!A1:A1 == sheet_id: 0,
                #                   start_row_index: 0, end_row_index: 1,
                #                   start_column_index: 0, end_column_index: 1`
                #
                #   `Sheet1!A3:B4 == sheet_id: 0,
                #                   start_row_index: 2, end_row_index: 4,
                #                   start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A:B == sheet_id: 0,
                #                 start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1!A5:B == sheet_id: 0,
                #                  start_row_index: 4,
                #                  start_column_index: 0, end_column_index: 2`
                #
                #   `Sheet1 == sheet_id:0`
                #
                # The start index must always be less than or equal to the end index.
                # If the start index equals the end index, then the range is empty.
                # Empty ranges are typically not meaningful and are usually rendered in the
                # UI as `#REF!`.
              &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
              &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
              &quot;sheetId&quot;: 42, # The sheet this range is on.
              &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
              &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
            },
          },
        ],
        &quot;properties&quot;: { # Properties of a sheet. # The properties of the sheet.
          &quot;index&quot;: 42, # The index of the sheet within the spreadsheet.
              # When adding or updating sheet properties, if this field
              # is excluded then the sheet is added or moved to the end
              # of the sheet list. When updating sheet indices or inserting
              # sheets, movement is considered in &quot;before the move&quot; indexes.
              # For example, if there were 3 sheets (S1, S2, S3) in order to
              # move S1 ahead of S2 the index would have to be set to 2. A sheet
              # index update request is ignored if the requested index is
              # identical to the sheets current index or if the requested new
              # index is equal to the current sheet index + 1.
          &quot;title&quot;: &quot;A String&quot;, # The name of the sheet.
          &quot;gridProperties&quot;: { # Properties of a grid. # Additional properties of the sheet if this sheet is a grid.
              # (If the sheet is an object sheet, containing a chart or image, then
              # this field will be absent.)
              # When writing it is an error to set any grid properties on non-grid sheets.
            &quot;rowGroupControlAfter&quot;: True or False, # True if the row grouping control toggle is shown after the group.
            &quot;hideGridlines&quot;: True or False, # True if the grid isn&#x27;t showing gridlines in the UI.
            &quot;frozenColumnCount&quot;: 42, # The number of columns that are frozen in the grid.
            &quot;columnGroupControlAfter&quot;: True or False, # True if the column grouping control toggle is shown after the group.
            &quot;rowCount&quot;: 42, # The number of rows in the grid.
            &quot;frozenRowCount&quot;: 42, # The number of rows that are frozen in the grid.
            &quot;columnCount&quot;: 42, # The number of columns in the grid.
          },
          &quot;sheetId&quot;: 42, # The ID of the sheet. Must be non-negative.
              # This field cannot be changed once set.
          &quot;tabColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the tab in the UI.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;rightToLeft&quot;: True or False, # True if the sheet is an RTL sheet instead of an LTR sheet.
          &quot;tabColorStyle&quot;: { # A color value. # The color of the tab in the UI.
              # If tab_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;hidden&quot;: True or False, # True if the sheet is hidden in the UI, false if it&#x27;s visible.
          &quot;sheetType&quot;: &quot;A String&quot;, # The type of sheet. Defaults to GRID.
              # This field cannot be changed once set.
        },
        &quot;conditionalFormats&quot;: [ # The conditional format rules in this sheet.
          { # A rule describing a conditional format.
            &quot;ranges&quot;: [ # The ranges that are formatted if the condition is true.
                # All the ranges must be on the same grid.
              { # A range on a sheet.
                  # All indexes are zero-based.
                  # Indexes are half open, e.g the start index is inclusive
                  # and the end index is exclusive -- [start_index, end_index).
                  # Missing indexes indicate the range is unbounded on that side.
                  #
                  # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                  #
                  #   `Sheet1!A1:A1 == sheet_id: 0,
                  #                   start_row_index: 0, end_row_index: 1,
                  #                   start_column_index: 0, end_column_index: 1`
                  #
                  #   `Sheet1!A3:B4 == sheet_id: 0,
                  #                   start_row_index: 2, end_row_index: 4,
                  #                   start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A:B == sheet_id: 0,
                  #                 start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1!A5:B == sheet_id: 0,
                  #                  start_row_index: 4,
                  #                  start_column_index: 0, end_column_index: 2`
                  #
                  #   `Sheet1 == sheet_id:0`
                  #
                  # The start index must always be less than or equal to the end index.
                  # If the start index equals the end index, then the range is empty.
                  # Empty ranges are typically not meaningful and are usually rendered in the
                  # UI as `#REF!`.
                &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                &quot;sheetId&quot;: 42, # The sheet this range is on.
                &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
              },
            ],
            &quot;booleanRule&quot;: { # A rule that may or may not match, depending on the condition. # The formatting is either &quot;on&quot; or &quot;off&quot; according to the rule.
              &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition of the rule. If the condition evaluates to true,
                  # the format is applied.
                  # BooleanConditions are used by conditional formatting,
                  # data validation, and the criteria in filters.
                &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                    # on the condition type.  Some support zero values,
                    # others one or two values,
                    # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                  { # The value of the condition.
                    &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                        # Valid only if the type is
                        # DATE_BEFORE,
                        # DATE_AFTER,
                        # DATE_ON_OR_BEFORE or
                        # DATE_ON_OR_AFTER.
                        #
                        # Relative dates are not supported in data validation.
                        # They are supported only in conditional formatting and
                        # conditional filters.
                    &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                        # The value is parsed as if the user typed into a cell.
                        # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                  },
                ],
                &quot;type&quot;: &quot;A String&quot;, # The type of condition.
              },
              &quot;format&quot;: { # The format of a cell. # The format to apply.
                  # Conditional formatting can only apply a subset of formatting:
                  # bold, italic,
                  # strikethrough,
                  # foreground color &amp;
                  # background color.
                &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                  &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                      # the user&#x27;s locale will be used if necessary for the given type.
                      # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                      # more information about the supported patterns.
                  &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                      # When writing, this field must be set.
                },
                &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                  &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                  &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                    &quot;width&quot;: 42, # The width of the border, in pixels.
                        # Deprecated; the width is determined by the &quot;style&quot; field.
                    &quot;colorStyle&quot;: { # A color value. # The color of the border.
                        # If color is also set, this field takes precedence.
                      &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                      &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                    &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                  },
                },
                &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                    # Absent values indicate that the field isn&#x27;t specified.
                  &quot;fontSize&quot;: 42, # The size of the font.
                  &quot;underline&quot;: True or False, # True if the text is underlined.
                  &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                      # If foreground_color is also set, this field takes precedence.
                    &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                    &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                        # for simplicity of conversion to/from color representations in various
                        # languages over compactness; for example, the fields of this representation
                        # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                        # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                        # method in iOS; and, with just a little work, it can be easily formatted into
                        # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                        #
                        # Note: this proto does not carry information about the absolute color space
                        # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                        # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                        # space.
                        #
                        # Example (Java):
                        #
                        #      import com.google.type.Color;
                        #
                        #      // ...
                        #      public static java.awt.Color fromProto(Color protocolor) {
                        #        float alpha = protocolor.hasAlpha()
                        #            ? protocolor.getAlpha().getValue()
                        #            : 1.0;
                        #
                        #        return new java.awt.Color(
                        #            protocolor.getRed(),
                        #            protocolor.getGreen(),
                        #            protocolor.getBlue(),
                        #            alpha);
                        #      }
                        #
                        #      public static Color toProto(java.awt.Color color) {
                        #        float red = (float) color.getRed();
                        #        float green = (float) color.getGreen();
                        #        float blue = (float) color.getBlue();
                        #        float denominator = 255.0;
                        #        Color.Builder resultBuilder =
                        #            Color
                        #                .newBuilder()
                        #                .setRed(red / denominator)
                        #                .setGreen(green / denominator)
                        #                .setBlue(blue / denominator);
                        #        int alpha = color.getAlpha();
                        #        if (alpha != 255) {
                        #          result.setAlpha(
                        #              FloatValue
                        #                  .newBuilder()
                        #                  .setValue(((float) alpha) / denominator)
                        #                  .build());
                        #        }
                        #        return resultBuilder.build();
                        #      }
                        #      // ...
                        #
                        # Example (iOS / Obj-C):
                        #
                        #      // ...
                        #      static UIColor* fromProto(Color* protocolor) {
                        #         float red = [protocolor red];
                        #         float green = [protocolor green];
                        #         float blue = [protocolor blue];
                        #         FloatValue* alpha_wrapper = [protocolor alpha];
                        #         float alpha = 1.0;
                        #         if (alpha_wrapper != nil) {
                        #           alpha = [alpha_wrapper value];
                        #         }
                        #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                        #      }
                        #
                        #      static Color* toProto(UIColor* color) {
                        #          CGFloat red, green, blue, alpha;
                        #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                        #            return nil;
                        #          }
                        #          Color* result = [[Color alloc] init];
                        #          [result setRed:red];
                        #          [result setGreen:green];
                        #          [result setBlue:blue];
                        #          if (alpha &lt;= 0.9999) {
                        #            [result setAlpha:floatWrapperWithValue(alpha)];
                        #          }
                        #          [result autorelease];
                        #          return result;
                        #     }
                        #     // ...
                        #
                        #  Example (JavaScript):
                        #
                        #     // ...
                        #
                        #     var protoToCssColor = function(rgb_color) {
                        #        var redFrac = rgb_color.red || 0.0;
                        #        var greenFrac = rgb_color.green || 0.0;
                        #        var blueFrac = rgb_color.blue || 0.0;
                        #        var red = Math.floor(redFrac * 255);
                        #        var green = Math.floor(greenFrac * 255);
                        #        var blue = Math.floor(blueFrac * 255);
                        #
                        #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                        #           return rgbToCssColor_(red, green, blue);
                        #        }
                        #
                        #        var alphaFrac = rgb_color.alpha.value || 0.0;
                        #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                        #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                        #     };
                        #
                        #     var rgbToCssColor_ = function(red, green, blue) {
                        #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                        #       var hexString = rgbNumber.toString(16);
                        #       var missingZeros = 6 - hexString.length;
                        #       var resultBuilder = [&#x27;#&#x27;];
                        #       for (var i = 0; i &lt; missingZeros; i++) {
                        #          resultBuilder.push(&#x27;0&#x27;);
                        #       }
                        #       resultBuilder.push(hexString);
                        #       return resultBuilder.join(&#x27;&#x27;);
                        #     };
                        #
                        #     // ...
                      &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                          # the final pixel color is defined by the equation:
                          #
                          #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                          #
                          # This means that a value of 1.0 corresponds to a solid color, whereas
                          # a value of 0.0 corresponds to a completely transparent color. This
                          # uses a wrapper message rather than a simple float scalar so that it is
                          # possible to distinguish between a default value and the value being unset.
                          # If omitted, this color object is to be rendered as a solid color
                          # (as if the alpha value had been explicitly given with a value of 1.0).
                      &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                      &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                      &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                    },
                  },
                  &quot;bold&quot;: True or False, # True if the text is bold.
                  &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                  &quot;italic&quot;: True or False, # True if the text is italicized.
                  &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                  &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                },
                &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                  &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                      # Measured in degrees. Valid values are between -90 and 90. Positive
                      # angles are angled upwards, negative are angled downwards.
                      #
                      # Note: For LTR text direction positive angles are in the
                      # counterclockwise direction, whereas for RTL they are in the clockwise
                      # direction
                  &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                      # characters is unchanged.
                      # For example:
                      #
                      #     | V |
                      #     | e |
                      #     | r |
                      #     | t |
                      #     | i |
                      #     | c |
                      #     | a |
                      #     | l |
                },
                &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                    # If background_color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                    # When updating padding, every field must be specified.
                  &quot;right&quot;: 42, # The right padding of the cell.
                  &quot;bottom&quot;: 42, # The bottom padding of the cell.
                  &quot;left&quot;: 42, # The left padding of the cell.
                  &quot;top&quot;: 42, # The top padding of the cell.
                },
                &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
              },
            },
            &quot;gradientRule&quot;: { # A rule that applies a gradient color scale format, based on # The formatting will vary based on the gradients in the rule.
                # the interpolation points listed. The format of a cell will vary
                # based on its contents as compared to the values of the interpolation
                # points.
              &quot;midpoint&quot;: { # A single interpolation point on a gradient conditional format. # An optional midway interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;maxpoint&quot;: { # A single interpolation point on a gradient conditional format. # The final interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
              &quot;minpoint&quot;: { # A single interpolation point on a gradient conditional format. # The starting interpolation point.
                  # These pin the gradient color scale according to the color,
                  # type and value chosen.
                &quot;value&quot;: &quot;A String&quot;, # The value this interpolation point uses.  May be a formula.
                    # Unused if type is MIN or
                    # MAX.
                &quot;colorStyle&quot;: { # A color value. # The color this interpolation point should use.
                    # If color is also set, this field takes precedence.
                  &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                  &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                      # for simplicity of conversion to/from color representations in various
                      # languages over compactness; for example, the fields of this representation
                      # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                      # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                      # method in iOS; and, with just a little work, it can be easily formatted into
                      # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                      #
                      # Note: this proto does not carry information about the absolute color space
                      # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                      # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                      # space.
                      #
                      # Example (Java):
                      #
                      #      import com.google.type.Color;
                      #
                      #      // ...
                      #      public static java.awt.Color fromProto(Color protocolor) {
                      #        float alpha = protocolor.hasAlpha()
                      #            ? protocolor.getAlpha().getValue()
                      #            : 1.0;
                      #
                      #        return new java.awt.Color(
                      #            protocolor.getRed(),
                      #            protocolor.getGreen(),
                      #            protocolor.getBlue(),
                      #            alpha);
                      #      }
                      #
                      #      public static Color toProto(java.awt.Color color) {
                      #        float red = (float) color.getRed();
                      #        float green = (float) color.getGreen();
                      #        float blue = (float) color.getBlue();
                      #        float denominator = 255.0;
                      #        Color.Builder resultBuilder =
                      #            Color
                      #                .newBuilder()
                      #                .setRed(red / denominator)
                      #                .setGreen(green / denominator)
                      #                .setBlue(blue / denominator);
                      #        int alpha = color.getAlpha();
                      #        if (alpha != 255) {
                      #          result.setAlpha(
                      #              FloatValue
                      #                  .newBuilder()
                      #                  .setValue(((float) alpha) / denominator)
                      #                  .build());
                      #        }
                      #        return resultBuilder.build();
                      #      }
                      #      // ...
                      #
                      # Example (iOS / Obj-C):
                      #
                      #      // ...
                      #      static UIColor* fromProto(Color* protocolor) {
                      #         float red = [protocolor red];
                      #         float green = [protocolor green];
                      #         float blue = [protocolor blue];
                      #         FloatValue* alpha_wrapper = [protocolor alpha];
                      #         float alpha = 1.0;
                      #         if (alpha_wrapper != nil) {
                      #           alpha = [alpha_wrapper value];
                      #         }
                      #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                      #      }
                      #
                      #      static Color* toProto(UIColor* color) {
                      #          CGFloat red, green, blue, alpha;
                      #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                      #            return nil;
                      #          }
                      #          Color* result = [[Color alloc] init];
                      #          [result setRed:red];
                      #          [result setGreen:green];
                      #          [result setBlue:blue];
                      #          if (alpha &lt;= 0.9999) {
                      #            [result setAlpha:floatWrapperWithValue(alpha)];
                      #          }
                      #          [result autorelease];
                      #          return result;
                      #     }
                      #     // ...
                      #
                      #  Example (JavaScript):
                      #
                      #     // ...
                      #
                      #     var protoToCssColor = function(rgb_color) {
                      #        var redFrac = rgb_color.red || 0.0;
                      #        var greenFrac = rgb_color.green || 0.0;
                      #        var blueFrac = rgb_color.blue || 0.0;
                      #        var red = Math.floor(redFrac * 255);
                      #        var green = Math.floor(greenFrac * 255);
                      #        var blue = Math.floor(blueFrac * 255);
                      #
                      #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                      #           return rgbToCssColor_(red, green, blue);
                      #        }
                      #
                      #        var alphaFrac = rgb_color.alpha.value || 0.0;
                      #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                      #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                      #     };
                      #
                      #     var rgbToCssColor_ = function(red, green, blue) {
                      #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                      #       var hexString = rgbNumber.toString(16);
                      #       var missingZeros = 6 - hexString.length;
                      #       var resultBuilder = [&#x27;#&#x27;];
                      #       for (var i = 0; i &lt; missingZeros; i++) {
                      #          resultBuilder.push(&#x27;0&#x27;);
                      #       }
                      #       resultBuilder.push(hexString);
                      #       return resultBuilder.join(&#x27;&#x27;);
                      #     };
                      #
                      #     // ...
                    &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                        # the final pixel color is defined by the equation:
                        #
                        #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                        #
                        # This means that a value of 1.0 corresponds to a solid color, whereas
                        # a value of 0.0 corresponds to a completely transparent color. This
                        # uses a wrapper message rather than a simple float scalar so that it is
                        # possible to distinguish between a default value and the value being unset.
                        # If omitted, this color object is to be rendered as a solid color
                        # (as if the alpha value had been explicitly given with a value of 1.0).
                    &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                    &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                    &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                  },
                },
                &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color this interpolation point should use.
                    # for simplicity of conversion to/from color representations in various
                    # languages over compactness; for example, the fields of this representation
                    # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                    # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                    # method in iOS; and, with just a little work, it can be easily formatted into
                    # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                    #
                    # Note: this proto does not carry information about the absolute color space
                    # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                    # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                    # space.
                    #
                    # Example (Java):
                    #
                    #      import com.google.type.Color;
                    #
                    #      // ...
                    #      public static java.awt.Color fromProto(Color protocolor) {
                    #        float alpha = protocolor.hasAlpha()
                    #            ? protocolor.getAlpha().getValue()
                    #            : 1.0;
                    #
                    #        return new java.awt.Color(
                    #            protocolor.getRed(),
                    #            protocolor.getGreen(),
                    #            protocolor.getBlue(),
                    #            alpha);
                    #      }
                    #
                    #      public static Color toProto(java.awt.Color color) {
                    #        float red = (float) color.getRed();
                    #        float green = (float) color.getGreen();
                    #        float blue = (float) color.getBlue();
                    #        float denominator = 255.0;
                    #        Color.Builder resultBuilder =
                    #            Color
                    #                .newBuilder()
                    #                .setRed(red / denominator)
                    #                .setGreen(green / denominator)
                    #                .setBlue(blue / denominator);
                    #        int alpha = color.getAlpha();
                    #        if (alpha != 255) {
                    #          result.setAlpha(
                    #              FloatValue
                    #                  .newBuilder()
                    #                  .setValue(((float) alpha) / denominator)
                    #                  .build());
                    #        }
                    #        return resultBuilder.build();
                    #      }
                    #      // ...
                    #
                    # Example (iOS / Obj-C):
                    #
                    #      // ...
                    #      static UIColor* fromProto(Color* protocolor) {
                    #         float red = [protocolor red];
                    #         float green = [protocolor green];
                    #         float blue = [protocolor blue];
                    #         FloatValue* alpha_wrapper = [protocolor alpha];
                    #         float alpha = 1.0;
                    #         if (alpha_wrapper != nil) {
                    #           alpha = [alpha_wrapper value];
                    #         }
                    #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                    #      }
                    #
                    #      static Color* toProto(UIColor* color) {
                    #          CGFloat red, green, blue, alpha;
                    #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                    #            return nil;
                    #          }
                    #          Color* result = [[Color alloc] init];
                    #          [result setRed:red];
                    #          [result setGreen:green];
                    #          [result setBlue:blue];
                    #          if (alpha &lt;= 0.9999) {
                    #            [result setAlpha:floatWrapperWithValue(alpha)];
                    #          }
                    #          [result autorelease];
                    #          return result;
                    #     }
                    #     // ...
                    #
                    #  Example (JavaScript):
                    #
                    #     // ...
                    #
                    #     var protoToCssColor = function(rgb_color) {
                    #        var redFrac = rgb_color.red || 0.0;
                    #        var greenFrac = rgb_color.green || 0.0;
                    #        var blueFrac = rgb_color.blue || 0.0;
                    #        var red = Math.floor(redFrac * 255);
                    #        var green = Math.floor(greenFrac * 255);
                    #        var blue = Math.floor(blueFrac * 255);
                    #
                    #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                    #           return rgbToCssColor_(red, green, blue);
                    #        }
                    #
                    #        var alphaFrac = rgb_color.alpha.value || 0.0;
                    #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                    #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                    #     };
                    #
                    #     var rgbToCssColor_ = function(red, green, blue) {
                    #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                    #       var hexString = rgbNumber.toString(16);
                    #       var missingZeros = 6 - hexString.length;
                    #       var resultBuilder = [&#x27;#&#x27;];
                    #       for (var i = 0; i &lt; missingZeros; i++) {
                    #          resultBuilder.push(&#x27;0&#x27;);
                    #       }
                    #       resultBuilder.push(hexString);
                    #       return resultBuilder.join(&#x27;&#x27;);
                    #     };
                    #
                    #     // ...
                  &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                      # the final pixel color is defined by the equation:
                      #
                      #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                      #
                      # This means that a value of 1.0 corresponds to a solid color, whereas
                      # a value of 0.0 corresponds to a completely transparent color. This
                      # uses a wrapper message rather than a simple float scalar so that it is
                      # possible to distinguish between a default value and the value being unset.
                      # If omitted, this color object is to be rendered as a solid color
                      # (as if the alpha value had been explicitly given with a value of 1.0).
                  &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                  &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                  &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                },
                &quot;type&quot;: &quot;A String&quot;, # How the value should be interpreted.
              },
            },
          },
        ],
        &quot;data&quot;: [ # Data in the grid, if this is a grid sheet.
            #
            # The number of GridData objects returned is dependent on the number of
            # ranges requested on this sheet. For example, if this is representing
            # `Sheet1`, and the spreadsheet was requested with ranges
            # `Sheet1!A1:C10` and `Sheet1!D15:E20`, then the first GridData will have a
            # startRow/startColumn of `0`,
            # while the second one will have `startRow 14` (zero-based row 15),
            # and `startColumn 3` (zero-based column D).
          { # Data in the grid, as well as metadata about the dimensions.
            &quot;columnMetadata&quot;: [ # Metadata about the requested columns in the grid, starting with the column
                # in start_column.
              { # Properties about a dimension.
                &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                    # This field is read-only.
                &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                  { # Developer metadata associated with a location or object in a spreadsheet.
                      # Developer metadata may be used to associate arbitrary data with various
                      # parts of a spreadsheet and will remain associated at those locations as they
                      # move around and the spreadsheet is edited.  For example, if developer
                      # metadata is associated with row 5 and another row is then subsequently
                      # inserted above row 5, that original metadata will still be associated with
                      # the row it was first associated with (what is now row 6). If the associated
                      # object is deleted its metadata is deleted too.
                    &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                        # same key.  Developer metadata must always have a key specified.
                    &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                    &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                        # specified.
                    &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                        # specified when metadata is created, otherwise one will be randomly
                        # generated and assigned. Must be positive.
                    &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                      &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                      &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                      &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                      &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                          # a dimension. The specified DimensionRange must represent a single row
                          # or column; it cannot be unbounded or span multiple rows or columns.
                          # All indexes are zero-based.
                          # Indexes are half open: the start index is inclusive
                          # and the end index is exclusive.
                          # Missing indexes indicate the range is unbounded on that side.
                        &quot;sheetId&quot;: 42, # The sheet this span is on.
                        &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                        &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                        &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                      },
                    },
                  },
                ],
              },
            ],
            &quot;rowData&quot;: [ # The data in the grid, one entry per row,
                # starting with the row in startRow.
                # The values in RowData will correspond to columns starting
                # at start_column.
              { # Data about each cell in a row.
                &quot;values&quot;: [ # The values in the row, one per column.
                  { # Data about a specific cell.
                    &quot;pivotTable&quot;: { # A pivot table. # A pivot table anchored at this cell. The size of pivot table itself
                        # is computed dynamically based on its data, grouping, filters, values,
                        # etc. Only the top-left cell of the pivot table contains the pivot table
                        # definition. The other cells will contain the calculated values of the
                        # results of the pivot in their effective_value fields.
                      &quot;rows&quot;: [ # Each row grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                          &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                          &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group&#x27;s values.
                            &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                            &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group &amp; two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                # this would correspond to using the &quot;Total&quot; of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            ],
                          },
                          &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                              # This is only valid for row groupings and is ignored by columns.
                              #
                              # By default, we minimize repitition of headings by not showing higher
                              # level headings where they are the same. For example, even though the
                              # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                              # it is redundant with previous rows. Setting repeat_headings to true
                              # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                              #
                              #     +--------------+
                              #     | Q1     | Jan |
                              #     |        | Feb |
                              #     |        | Mar |
                              #     +--------+-----+
                              #     | Q1 Total     |
                              #     +--------------+
                          &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                              &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            },
                          ],
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                              # in the source data column rather than breaking out each individual value.
                              # Only one PivotGroup with a group rule may be added for each column in
                              # the source data, though on any given column you may add both a
                              # PivotGroup that has a rule and a PivotGroup that does not.
                            &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                # buckets of a constant size. All values from HistogramRule.start to
                                # HistogramRule.end are placed into groups of size
                                # HistogramRule.interval. In addition, all values below
                                # HistogramRule.start are placed in one group, and all values above
                                # HistogramRule.end are placed in another. Only
                                # HistogramRule.interval is required, though if HistogramRule.start
                                # and HistogramRule.end are both provided, HistogramRule.start must
                                # be less than HistogramRule.end. For example, a pivot table showing
                                # average purchase amount by age that has 50+ rows:
                                #
                                #     +-----+-------------------+
                                #     | Age | AVERAGE of Amount |
                                #     +-----+-------------------+
                                #     | 16  |            $27.13 |
                                #     | 17  |             $5.24 |
                                #     | 18  |            $20.15 |
                                #     ...
                                #     +-----+-------------------+
                                # could be turned into a pivot table that looks like the one below by
                                # applying a histogram group rule with a HistogramRule.start of 25,
                                # an HistogramRule.interval of 20, and an HistogramRule.end
                                # of 65.
                                #
                                #     +-------------+-------------------+
                                #     | Grouped Age | AVERAGE of Amount |
                                #     +-------------+-------------------+
                                #     | &lt; 25        |            $19.34 |
                                #     | 25-45       |            $31.43 |
                                #     | 45-65       |            $35.87 |
                                #     | &gt; 65        |            $27.55 |
                                #     +-------------+-------------------+
                                #     | Grand Total |            $29.12 |
                                #     +-------------+-------------------+
                              &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                  # of constant size. Values below start are lumped into a single bucket.
                                  # This field is optional.
                              &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                  # of constant size. Values above end are lumped into a single bucket.
                                  # This field is optional.
                              &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                            },
                            &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                # buckets based on selected parts of their date or time values. For example,
                                # consider a pivot table showing sales transactions by date:
                                #
                                #     +----------+--------------+
                                #     | Date     | SUM of Sales |
                                #     +----------+--------------+
                                #     | 1/1/2017 |      $621.14 |
                                #     | 2/3/2017 |      $708.84 |
                                #     | 5/8/2017 |      $326.84 |
                                #     ...
                                #     +----------+--------------+
                                # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                # results in the following pivot table.
                                #
                                #     +--------------+--------------+
                                #     | Grouped Date | SUM of Sales |
                                #     +--------------+--------------+
                                #     | 2017-Jan     |   $53,731.78 |
                                #     | 2017-Feb     |   $83,475.32 |
                                #     | 2017-Mar     |   $94,385.05 |
                                #     ...
                                #     +--------------+--------------+
                              &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                            },
                            &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                # buckets with names of your choosing. For example, a pivot table that
                                # aggregates population by state:
                                #
                                #     +-------+-------------------+
                                #     | State | SUM of Population |
                                #     +-------+-------------------+
                                #     | AK    |               0.7 |
                                #     | AL    |               4.8 |
                                #     | AR    |               2.9 |
                                #     ...
                                #     +-------+-------------------+
                                # could be turned into a pivot table that aggregates population by time zone
                                # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                # Note that a similar effect could be achieved by adding a time zone column
                                # to the source data and adjusting the pivot table.
                                #
                                #     +-----------+-------------------+
                                #     | Time Zone | SUM of Population |
                                #     +-----------+-------------------+
                                #     | Central   |             106.3 |
                                #     | Eastern   |             151.9 |
                                #     | Mountain  |              17.4 |
                                #     ...
                                #     +-----------+-------------------+
                              &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                  # that map to each group name.
                                { # A group name and a list of items from the source data that should be placed
                                    # in the group with this name.
                                  &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                      # item may be a string, number, or boolean. Items may appear in at most one
                                      # group within a given ManualRule. Items that do not appear in any
                                      # group will appear on their own.
                                    { # The kinds of value that a cell in a spreadsheet can have.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  ],
                                  &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                      # ManualRule must have a unique group name.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                },
                              ],
                            },
                          },
                          &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                              # example, in the following pivot table, the row label is `Region` (which
                              # could be renamed to `State`) and the column label is `Product` (which
                              # could be renamed `Item`). Pivot tables created before December 2017 do
                              # not have header labels. If you&#x27;d like to add header labels to an existing
                              # pivot table, please delete the existing pivot table and then create a new
                              # pivot table with same parameters.
                              #
                              #     +--------------+---------+-------+
                              #     | SUM of Units | Product |       |
                              #     | Region       | Pen     | Paper |
                              #     +--------------+---------+-------+
                              #     | New York     |     345 |    98 |
                              #     | Oregon       |     234 |   123 |
                              #     | Tennessee    |     531 |   415 |
                              #     +--------------+---------+-------+
                              #     | Grand Total  |    1110 |   636 |
                              #     +--------------+---------+-------+
                        },
                      ],
                      &quot;source&quot;: { # A range on a sheet. # The range the pivot table is reading data from.
                          # All indexes are zero-based.
                          # Indexes are half open, e.g the start index is inclusive
                          # and the end index is exclusive -- [start_index, end_index).
                          # Missing indexes indicate the range is unbounded on that side.
                          #
                          # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
                          #
                          #   `Sheet1!A1:A1 == sheet_id: 0,
                          #                   start_row_index: 0, end_row_index: 1,
                          #                   start_column_index: 0, end_column_index: 1`
                          #
                          #   `Sheet1!A3:B4 == sheet_id: 0,
                          #                   start_row_index: 2, end_row_index: 4,
                          #                   start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A:B == sheet_id: 0,
                          #                 start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1!A5:B == sheet_id: 0,
                          #                  start_row_index: 4,
                          #                  start_column_index: 0, end_column_index: 2`
                          #
                          #   `Sheet1 == sheet_id:0`
                          #
                          # The start index must always be less than or equal to the end index.
                          # If the start index equals the end index, then the range is empty.
                          # Empty ranges are typically not meaningful and are usually rendered in the
                          # UI as `#REF!`.
                        &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
                        &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
                        &quot;sheetId&quot;: 42, # The sheet this range is on.
                        &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
                        &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
                      },
                      &quot;values&quot;: [ # A list of values to include in the pivot table.
                        { # The definition of how a value in a pivot table should be calculated.
                          &quot;calculatedDisplayType&quot;: &quot;A String&quot;, # If specified, indicates that pivot values should be displayed as
                              # the result of a calculation with another pivot value. For example, if
                              # calculated_display_type is specified as PERCENT_OF_GRAND_TOTAL, all the
                              # pivot values are displayed as the percentage of the grand total. In
                              # the Sheets UI, this is referred to as &quot;Show As&quot; in the value section of a
                              # pivot table.
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this value reads from.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this value refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;formula&quot;: &quot;A String&quot;, # A custom formula to calculate the value.  The formula must start
                              # with an `=` character.
                          &quot;summarizeFunction&quot;: &quot;A String&quot;, # A function to summarize the value.
                              # If formula is set, the only supported values are
                              # SUM and
                              # CUSTOM.
                              # If sourceColumnOffset is set, then `CUSTOM`
                              # is not supported.
                          &quot;name&quot;: &quot;A String&quot;, # A name to use for the value.
                        },
                      ],
                      &quot;columns&quot;: [ # Each column grouping in the pivot table.
                        { # A single grouping (either row or column) in a pivot table.
                          &quot;showTotals&quot;: True or False, # True if the pivot table should include the totals for this grouping.
                          &quot;sortOrder&quot;: &quot;A String&quot;, # The order the values in this group should be sorted.
                          &quot;valueBucket&quot;: { # Information about which values in a pivot group should be used for sorting. # The bucket of the opposite pivot group to sort by.
                              # If not specified, sorting is alphabetical by this group&#x27;s values.
                            &quot;valuesIndex&quot;: 42, # The offset in the PivotTable.values list which the values in this
                                # grouping should be sorted by.
                            &quot;buckets&quot;: [ # Determines the bucket from which values are chosen to sort.
                                #
                                # For example, in a pivot table with one row group &amp; two column groups,
                                # the row group can list up to two values. The first value corresponds
                                # to a value within the first column group, and the second value
                                # corresponds to a value in the second column group.  If no values
                                # are listed, this would indicate that the row should be sorted according
                                # to the &quot;Grand Total&quot; over the column groups. If a single value is listed,
                                # this would correspond to using the &quot;Total&quot; of that bucket.
                              { # The kinds of value that a cell in a spreadsheet can have.
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            ],
                          },
                          &quot;repeatHeadings&quot;: True or False, # True if the headings in this pivot group should be repeated.
                              # This is only valid for row groupings and is ignored by columns.
                              #
                              # By default, we minimize repitition of headings by not showing higher
                              # level headings where they are the same. For example, even though the
                              # third row below corresponds to &quot;Q1 Mar&quot;, &quot;Q1&quot; is not shown because
                              # it is redundant with previous rows. Setting repeat_headings to true
                              # would cause &quot;Q1&quot; to be repeated for &quot;Feb&quot; and &quot;Mar&quot;.
                              #
                              #     +--------------+
                              #     | Q1     | Jan |
                              #     |        | Feb |
                              #     |        | Mar |
                              #     +--------+-----+
                              #     | Q1 Total     |
                              #     +--------------+
                          &quot;valueMetadata&quot;: [ # Metadata about values in the grouping.
                            { # Metadata about a value in a pivot grouping.
                              &quot;collapsed&quot;: True or False, # True if the data corresponding to the value is collapsed.
                              &quot;value&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The calculated value the metadata corresponds to.
                                  # (Note that formulaValue is not valid,
                                  #  because the values will be calculated.)
                                &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                    # This field is read-only.
                                  &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                      # (in the spreadsheet&#x27;s locale).
                                  &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                },
                                &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                    # Leading single quotes are not included. For example, if the user typed
                                    # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                    # `&quot;123&quot;`.
                                &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                &quot;numberValue&quot;: 3.14, # Represents a double value.
                                    # Note: Dates, Times and DateTimes are represented as doubles in
                                    # &quot;serial number&quot; format.
                              },
                            },
                          ],
                          &quot;sourceColumnOffset&quot;: 42, # The column offset of the source range that this grouping is based on.
                              #
                              # For example, if the source was `C10:E15`, a `sourceColumnOffset` of `0`
                              # means this group refers to column `C`, whereas the offset `1` would
                              # refer to column `D`.
                          &quot;groupRule&quot;: { # An optional setting on a PivotGroup that defines buckets for the values # The group rule to apply to this row/column group.
                              # in the source data column rather than breaking out each individual value.
                              # Only one PivotGroup with a group rule may be added for each column in
                              # the source data, though on any given column you may add both a
                              # PivotGroup that has a rule and a PivotGroup that does not.
                            &quot;histogramRule&quot;: { # Allows you to organize the numeric values in a source data column into # A HistogramRule.
                                # buckets of a constant size. All values from HistogramRule.start to
                                # HistogramRule.end are placed into groups of size
                                # HistogramRule.interval. In addition, all values below
                                # HistogramRule.start are placed in one group, and all values above
                                # HistogramRule.end are placed in another. Only
                                # HistogramRule.interval is required, though if HistogramRule.start
                                # and HistogramRule.end are both provided, HistogramRule.start must
                                # be less than HistogramRule.end. For example, a pivot table showing
                                # average purchase amount by age that has 50+ rows:
                                #
                                #     +-----+-------------------+
                                #     | Age | AVERAGE of Amount |
                                #     +-----+-------------------+
                                #     | 16  |            $27.13 |
                                #     | 17  |             $5.24 |
                                #     | 18  |            $20.15 |
                                #     ...
                                #     +-----+-------------------+
                                # could be turned into a pivot table that looks like the one below by
                                # applying a histogram group rule with a HistogramRule.start of 25,
                                # an HistogramRule.interval of 20, and an HistogramRule.end
                                # of 65.
                                #
                                #     +-------------+-------------------+
                                #     | Grouped Age | AVERAGE of Amount |
                                #     +-------------+-------------------+
                                #     | &lt; 25        |            $19.34 |
                                #     | 25-45       |            $31.43 |
                                #     | 45-65       |            $35.87 |
                                #     | &gt; 65        |            $27.55 |
                                #     +-------------+-------------------+
                                #     | Grand Total |            $29.12 |
                                #     +-------------+-------------------+
                              &quot;start&quot;: 3.14, # The minimum value at which items are placed into buckets
                                  # of constant size. Values below start are lumped into a single bucket.
                                  # This field is optional.
                              &quot;end&quot;: 3.14, # The maximum value at which items are placed into buckets
                                  # of constant size. Values above end are lumped into a single bucket.
                                  # This field is optional.
                              &quot;interval&quot;: 3.14, # The size of the buckets that are created. Must be positive.
                            },
                            &quot;dateTimeRule&quot;: { # Allows you to organize the date-time values in a source data column into # A DateTimeRule.
                                # buckets based on selected parts of their date or time values. For example,
                                # consider a pivot table showing sales transactions by date:
                                #
                                #     +----------+--------------+
                                #     | Date     | SUM of Sales |
                                #     +----------+--------------+
                                #     | 1/1/2017 |      $621.14 |
                                #     | 2/3/2017 |      $708.84 |
                                #     | 5/8/2017 |      $326.84 |
                                #     ...
                                #     +----------+--------------+
                                # Applying a date-time group rule with a DateTimeRuleType of YEAR_MONTH
                                # results in the following pivot table.
                                #
                                #     +--------------+--------------+
                                #     | Grouped Date | SUM of Sales |
                                #     +--------------+--------------+
                                #     | 2017-Jan     |   $53,731.78 |
                                #     | 2017-Feb     |   $83,475.32 |
                                #     | 2017-Mar     |   $94,385.05 |
                                #     ...
                                #     +--------------+--------------+
                              &quot;type&quot;: &quot;A String&quot;, # The type of date-time grouping to apply.
                            },
                            &quot;manualRule&quot;: { # Allows you to manually organize the values in a source data column into # A ManualRule.
                                # buckets with names of your choosing. For example, a pivot table that
                                # aggregates population by state:
                                #
                                #     +-------+-------------------+
                                #     | State | SUM of Population |
                                #     +-------+-------------------+
                                #     | AK    |               0.7 |
                                #     | AL    |               4.8 |
                                #     | AR    |               2.9 |
                                #     ...
                                #     +-------+-------------------+
                                # could be turned into a pivot table that aggregates population by time zone
                                # by providing a list of groups (for example, groupName = &#x27;Central&#x27;,
                                # items = [&#x27;AL&#x27;, &#x27;AR&#x27;, &#x27;IA&#x27;, ...]) to a manual group rule.
                                # Note that a similar effect could be achieved by adding a time zone column
                                # to the source data and adjusting the pivot table.
                                #
                                #     +-----------+-------------------+
                                #     | Time Zone | SUM of Population |
                                #     +-----------+-------------------+
                                #     | Central   |             106.3 |
                                #     | Eastern   |             151.9 |
                                #     | Mountain  |              17.4 |
                                #     ...
                                #     +-----------+-------------------+
                              &quot;groups&quot;: [ # The list of group names and the corresponding items from the source data
                                  # that map to each group name.
                                { # A group name and a list of items from the source data that should be placed
                                    # in the group with this name.
                                  &quot;items&quot;: [ # The items in the source data that should be placed into this group. Each
                                      # item may be a string, number, or boolean. Items may appear in at most one
                                      # group within a given ManualRule. Items that do not appear in any
                                      # group will appear on their own.
                                    { # The kinds of value that a cell in a spreadsheet can have.
                                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                          # This field is read-only.
                                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                            # (in the spreadsheet&#x27;s locale).
                                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                      },
                                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                          # Leading single quotes are not included. For example, if the user typed
                                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                          # `&quot;123&quot;`.
                                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                                          # Note: Dates, Times and DateTimes are represented as doubles in
                                          # &quot;serial number&quot; format.
                                    },
                                  ],
                                  &quot;groupName&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The group name, which must be a string. Each group in a given
                                      # ManualRule must have a unique group name.
                                    &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                                        # This field is read-only.
                                      &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                                          # (in the spreadsheet&#x27;s locale).
                                      &quot;type&quot;: &quot;A String&quot;, # The type of error.
                                    },
                                    &quot;boolValue&quot;: True or False, # Represents a boolean value.
                                    &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                                        # Leading single quotes are not included. For example, if the user typed
                                        # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                                        # `&quot;123&quot;`.
                                    &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                                    &quot;numberValue&quot;: 3.14, # Represents a double value.
                                        # Note: Dates, Times and DateTimes are represented as doubles in
                                        # &quot;serial number&quot; format.
                                  },
                                },
                              ],
                            },
                          },
                          &quot;label&quot;: &quot;A String&quot;, # The labels to use for the row/column groups which can be customized. For
                              # example, in the following pivot table, the row label is `Region` (which
                              # could be renamed to `State`) and the column label is `Product` (which
                              # could be renamed `Item`). Pivot tables created before December 2017 do
                              # not have header labels. If you&#x27;d like to add header labels to an existing
                              # pivot table, please delete the existing pivot table and then create a new
                              # pivot table with same parameters.
                              #
                              #     +--------------+---------+-------+
                              #     | SUM of Units | Product |       |
                              #     | Region       | Pen     | Paper |
                              #     +--------------+---------+-------+
                              #     | New York     |     345 |    98 |
                              #     | Oregon       |     234 |   123 |
                              #     | Tennessee    |     531 |   415 |
                              #     +--------------+---------+-------+
                              #     | Grand Total  |    1110 |   636 |
                              #     +--------------+---------+-------+
                        },
                      ],
                      &quot;valueLayout&quot;: &quot;A String&quot;, # Whether values should be listed horizontally (as columns)
                          # or vertically (as rows).
                      &quot;criteria&quot;: { # An optional mapping of filters per source column offset.
                          #
                          # The filters are applied before aggregating data into the pivot table.
                          # The map&#x27;s key is the column offset of the source range that you want to
                          # filter, and the value is the criteria for that column.
                          #
                          # For example, if the source was `C10:E15`, a key of `0` will have the filter
                          # for column `C`, whereas the key `1` is for column `D`.
                        &quot;a_key&quot;: { # Criteria for showing/hiding rows in a pivot table.
                          &quot;visibleValues&quot;: [ # Values that should be included.  Values not listed here are excluded.
                            &quot;A String&quot;,
                          ],
                        },
                      },
                    },
                    &quot;formattedValue&quot;: &quot;A String&quot;, # The formatted value of the cell.
                        # This is the value as it&#x27;s shown to the user.
                        # This field is read-only.
                    &quot;textFormatRuns&quot;: [ # Runs of rich text applied to subsections of the cell.  Runs are only valid
                        # on user entered strings, not formulas, bools, or numbers.
                        # Runs start at specific indexes in the text and continue until the next
                        # run. Properties of a run will continue unless explicitly changed
                        # in a subsequent run (and properties of the first run will continue
                        # the properties of the cell unless explicitly changed).
                        #
                        # When writing, the new runs will overwrite any prior runs.  When writing a
                        # new user_entered_value, previous runs are erased.
                      { # A run of a text format. The format of this run continues until the start
                          # index of the next run.
                          # When updating, all fields must be set.
                        &quot;format&quot;: { # The format of a run of text in a cell. # The format of this run.  Absent values inherit the cell&#x27;s format.
                            # Absent values indicate that the field isn&#x27;t specified.
                          &quot;fontSize&quot;: 42, # The size of the font.
                          &quot;underline&quot;: True or False, # True if the text is underlined.
                          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                              # If foreground_color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;bold&quot;: True or False, # True if the text is bold.
                          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;italic&quot;: True or False, # True if the text is italicized.
                          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                        },
                        &quot;startIndex&quot;: 42, # The character index where this run starts.
                      },
                    ],
                    &quot;effectiveValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The effective value of the cell. For cells with formulas, this is
                        # the calculated value.  For cells with literals, this is
                        # the same as the user_entered_value.
                        # This field is read-only.
                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                            # (in the spreadsheet&#x27;s locale).
                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                      },
                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                          # `&quot;123&quot;`.
                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # &quot;serial number&quot; format.
                    },
                    &quot;effectiveFormat&quot;: { # The format of a cell. # The effective format being used by the cell.
                        # This includes the results of applying any conditional formatting and,
                        # if the cell contains a formula, the computed number format.
                        # If the effective format is the default format, effective format will
                        # not be written.
                        # This field is read-only.
                      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user&#x27;s locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                            # more information about the supported patterns.
                        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                            # When writing, this field must be set.
                      },
                      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                      },
                      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                            # Measured in degrees. Valid values are between -90 and 90. Positive
                            # angles are angled upwards, negative are angled downwards.
                            #
                            # Note: For LTR text direction positive angles are in the
                            # counterclockwise direction, whereas for RTL they are in the clockwise
                            # direction
                        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                            # characters is unchanged.
                            # For example:
                            #
                            #     | V |
                            #     | e |
                            #     | r |
                            #     | t |
                            #     | i |
                            #     | c |
                            #     | a |
                            #     | l |
                      },
                      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                          # If background_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        &quot;right&quot;: 42, # The right padding of the cell.
                        &quot;bottom&quot;: 42, # The bottom padding of the cell.
                        &quot;left&quot;: 42, # The left padding of the cell.
                        &quot;top&quot;: 42, # The top padding of the cell.
                      },
                      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;note&quot;: &quot;A String&quot;, # Any note on the cell.
                    &quot;userEnteredFormat&quot;: { # The format of a cell. # The format the user entered for the cell.
                        #
                        # When writing, the new format will be merged with the existing format.
                      &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
                      &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
                      &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
                      &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
                      &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
                        &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
                            # the user&#x27;s locale will be used if necessary for the given type.
                            # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
                            # more information about the supported patterns.
                        &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
                            # When writing, this field must be set.
                      },
                      &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
                        &quot;left&quot;: { # A border along a cell. # The left border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;top&quot;: { # A border along a cell. # The top border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;right&quot;: { # A border along a cell. # The right border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                        &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
                          &quot;width&quot;: 42, # The width of the border, in pixels.
                              # Deprecated; the width is determined by the &quot;style&quot; field.
                          &quot;colorStyle&quot;: { # A color value. # The color of the border.
                              # If color is also set, this field takes precedence.
                            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                                # for simplicity of conversion to/from color representations in various
                                # languages over compactness; for example, the fields of this representation
                                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                                # method in iOS; and, with just a little work, it can be easily formatted into
                                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                                #
                                # Note: this proto does not carry information about the absolute color space
                                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                                # space.
                                #
                                # Example (Java):
                                #
                                #      import com.google.type.Color;
                                #
                                #      // ...
                                #      public static java.awt.Color fromProto(Color protocolor) {
                                #        float alpha = protocolor.hasAlpha()
                                #            ? protocolor.getAlpha().getValue()
                                #            : 1.0;
                                #
                                #        return new java.awt.Color(
                                #            protocolor.getRed(),
                                #            protocolor.getGreen(),
                                #            protocolor.getBlue(),
                                #            alpha);
                                #      }
                                #
                                #      public static Color toProto(java.awt.Color color) {
                                #        float red = (float) color.getRed();
                                #        float green = (float) color.getGreen();
                                #        float blue = (float) color.getBlue();
                                #        float denominator = 255.0;
                                #        Color.Builder resultBuilder =
                                #            Color
                                #                .newBuilder()
                                #                .setRed(red / denominator)
                                #                .setGreen(green / denominator)
                                #                .setBlue(blue / denominator);
                                #        int alpha = color.getAlpha();
                                #        if (alpha != 255) {
                                #          result.setAlpha(
                                #              FloatValue
                                #                  .newBuilder()
                                #                  .setValue(((float) alpha) / denominator)
                                #                  .build());
                                #        }
                                #        return resultBuilder.build();
                                #      }
                                #      // ...
                                #
                                # Example (iOS / Obj-C):
                                #
                                #      // ...
                                #      static UIColor* fromProto(Color* protocolor) {
                                #         float red = [protocolor red];
                                #         float green = [protocolor green];
                                #         float blue = [protocolor blue];
                                #         FloatValue* alpha_wrapper = [protocolor alpha];
                                #         float alpha = 1.0;
                                #         if (alpha_wrapper != nil) {
                                #           alpha = [alpha_wrapper value];
                                #         }
                                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                                #      }
                                #
                                #      static Color* toProto(UIColor* color) {
                                #          CGFloat red, green, blue, alpha;
                                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                                #            return nil;
                                #          }
                                #          Color* result = [[Color alloc] init];
                                #          [result setRed:red];
                                #          [result setGreen:green];
                                #          [result setBlue:blue];
                                #          if (alpha &lt;= 0.9999) {
                                #            [result setAlpha:floatWrapperWithValue(alpha)];
                                #          }
                                #          [result autorelease];
                                #          return result;
                                #     }
                                #     // ...
                                #
                                #  Example (JavaScript):
                                #
                                #     // ...
                                #
                                #     var protoToCssColor = function(rgb_color) {
                                #        var redFrac = rgb_color.red || 0.0;
                                #        var greenFrac = rgb_color.green || 0.0;
                                #        var blueFrac = rgb_color.blue || 0.0;
                                #        var red = Math.floor(redFrac * 255);
                                #        var green = Math.floor(greenFrac * 255);
                                #        var blue = Math.floor(blueFrac * 255);
                                #
                                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                                #           return rgbToCssColor_(red, green, blue);
                                #        }
                                #
                                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                                #     };
                                #
                                #     var rgbToCssColor_ = function(red, green, blue) {
                                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                                #       var hexString = rgbNumber.toString(16);
                                #       var missingZeros = 6 - hexString.length;
                                #       var resultBuilder = [&#x27;#&#x27;];
                                #       for (var i = 0; i &lt; missingZeros; i++) {
                                #          resultBuilder.push(&#x27;0&#x27;);
                                #       }
                                #       resultBuilder.push(hexString);
                                #       return resultBuilder.join(&#x27;&#x27;);
                                #     };
                                #
                                #     // ...
                              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                  # the final pixel color is defined by the equation:
                                  #
                                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                  #
                                  # This means that a value of 1.0 corresponds to a solid color, whereas
                                  # a value of 0.0 corresponds to a completely transparent color. This
                                  # uses a wrapper message rather than a simple float scalar so that it is
                                  # possible to distinguish between a default value and the value being unset.
                                  # If omitted, this color object is to be rendered as a solid color
                                  # (as if the alpha value had been explicitly given with a value of 1.0).
                              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                            },
                          },
                          &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                          &quot;style&quot;: &quot;A String&quot;, # The style of the border.
                        },
                      },
                      &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
                      &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
                          # Absent values indicate that the field isn&#x27;t specified.
                        &quot;fontSize&quot;: 42, # The size of the font.
                        &quot;underline&quot;: True or False, # True if the text is underlined.
                        &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
                            # If foreground_color is also set, this field takes precedence.
                          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                              # for simplicity of conversion to/from color representations in various
                              # languages over compactness; for example, the fields of this representation
                              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                              # method in iOS; and, with just a little work, it can be easily formatted into
                              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                              #
                              # Note: this proto does not carry information about the absolute color space
                              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                              # space.
                              #
                              # Example (Java):
                              #
                              #      import com.google.type.Color;
                              #
                              #      // ...
                              #      public static java.awt.Color fromProto(Color protocolor) {
                              #        float alpha = protocolor.hasAlpha()
                              #            ? protocolor.getAlpha().getValue()
                              #            : 1.0;
                              #
                              #        return new java.awt.Color(
                              #            protocolor.getRed(),
                              #            protocolor.getGreen(),
                              #            protocolor.getBlue(),
                              #            alpha);
                              #      }
                              #
                              #      public static Color toProto(java.awt.Color color) {
                              #        float red = (float) color.getRed();
                              #        float green = (float) color.getGreen();
                              #        float blue = (float) color.getBlue();
                              #        float denominator = 255.0;
                              #        Color.Builder resultBuilder =
                              #            Color
                              #                .newBuilder()
                              #                .setRed(red / denominator)
                              #                .setGreen(green / denominator)
                              #                .setBlue(blue / denominator);
                              #        int alpha = color.getAlpha();
                              #        if (alpha != 255) {
                              #          result.setAlpha(
                              #              FloatValue
                              #                  .newBuilder()
                              #                  .setValue(((float) alpha) / denominator)
                              #                  .build());
                              #        }
                              #        return resultBuilder.build();
                              #      }
                              #      // ...
                              #
                              # Example (iOS / Obj-C):
                              #
                              #      // ...
                              #      static UIColor* fromProto(Color* protocolor) {
                              #         float red = [protocolor red];
                              #         float green = [protocolor green];
                              #         float blue = [protocolor blue];
                              #         FloatValue* alpha_wrapper = [protocolor alpha];
                              #         float alpha = 1.0;
                              #         if (alpha_wrapper != nil) {
                              #           alpha = [alpha_wrapper value];
                              #         }
                              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                              #      }
                              #
                              #      static Color* toProto(UIColor* color) {
                              #          CGFloat red, green, blue, alpha;
                              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                              #            return nil;
                              #          }
                              #          Color* result = [[Color alloc] init];
                              #          [result setRed:red];
                              #          [result setGreen:green];
                              #          [result setBlue:blue];
                              #          if (alpha &lt;= 0.9999) {
                              #            [result setAlpha:floatWrapperWithValue(alpha)];
                              #          }
                              #          [result autorelease];
                              #          return result;
                              #     }
                              #     // ...
                              #
                              #  Example (JavaScript):
                              #
                              #     // ...
                              #
                              #     var protoToCssColor = function(rgb_color) {
                              #        var redFrac = rgb_color.red || 0.0;
                              #        var greenFrac = rgb_color.green || 0.0;
                              #        var blueFrac = rgb_color.blue || 0.0;
                              #        var red = Math.floor(redFrac * 255);
                              #        var green = Math.floor(greenFrac * 255);
                              #        var blue = Math.floor(blueFrac * 255);
                              #
                              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                              #           return rgbToCssColor_(red, green, blue);
                              #        }
                              #
                              #        var alphaFrac = rgb_color.alpha.value || 0.0;
                              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                              #     };
                              #
                              #     var rgbToCssColor_ = function(red, green, blue) {
                              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                              #       var hexString = rgbNumber.toString(16);
                              #       var missingZeros = 6 - hexString.length;
                              #       var resultBuilder = [&#x27;#&#x27;];
                              #       for (var i = 0; i &lt; missingZeros; i++) {
                              #          resultBuilder.push(&#x27;0&#x27;);
                              #       }
                              #       resultBuilder.push(hexString);
                              #       return resultBuilder.join(&#x27;&#x27;);
                              #     };
                              #
                              #     // ...
                            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                                # the final pixel color is defined by the equation:
                                #
                                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                                #
                                # This means that a value of 1.0 corresponds to a solid color, whereas
                                # a value of 0.0 corresponds to a completely transparent color. This
                                # uses a wrapper message rather than a simple float scalar so that it is
                                # possible to distinguish between a default value and the value being unset.
                                # If omitted, this color object is to be rendered as a solid color
                                # (as if the alpha value had been explicitly given with a value of 1.0).
                            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                          },
                        },
                        &quot;bold&quot;: True or False, # True if the text is bold.
                        &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                        &quot;italic&quot;: True or False, # True if the text is italicized.
                        &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
                        &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
                      },
                      &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
                        &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
                            # Measured in degrees. Valid values are between -90 and 90. Positive
                            # angles are angled upwards, negative are angled downwards.
                            #
                            # Note: For LTR text direction positive angles are in the
                            # counterclockwise direction, whereas for RTL they are in the clockwise
                            # direction
                        &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
                            # characters is unchanged.
                            # For example:
                            #
                            #     | V |
                            #     | e |
                            #     | r |
                            #     | t |
                            #     | i |
                            #     | c |
                            #     | a |
                            #     | l |
                      },
                      &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
                          # If background_color is also set, this field takes precedence.
                        &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
                        &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                            # for simplicity of conversion to/from color representations in various
                            # languages over compactness; for example, the fields of this representation
                            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                            # method in iOS; and, with just a little work, it can be easily formatted into
                            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                            #
                            # Note: this proto does not carry information about the absolute color space
                            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                            # space.
                            #
                            # Example (Java):
                            #
                            #      import com.google.type.Color;
                            #
                            #      // ...
                            #      public static java.awt.Color fromProto(Color protocolor) {
                            #        float alpha = protocolor.hasAlpha()
                            #            ? protocolor.getAlpha().getValue()
                            #            : 1.0;
                            #
                            #        return new java.awt.Color(
                            #            protocolor.getRed(),
                            #            protocolor.getGreen(),
                            #            protocolor.getBlue(),
                            #            alpha);
                            #      }
                            #
                            #      public static Color toProto(java.awt.Color color) {
                            #        float red = (float) color.getRed();
                            #        float green = (float) color.getGreen();
                            #        float blue = (float) color.getBlue();
                            #        float denominator = 255.0;
                            #        Color.Builder resultBuilder =
                            #            Color
                            #                .newBuilder()
                            #                .setRed(red / denominator)
                            #                .setGreen(green / denominator)
                            #                .setBlue(blue / denominator);
                            #        int alpha = color.getAlpha();
                            #        if (alpha != 255) {
                            #          result.setAlpha(
                            #              FloatValue
                            #                  .newBuilder()
                            #                  .setValue(((float) alpha) / denominator)
                            #                  .build());
                            #        }
                            #        return resultBuilder.build();
                            #      }
                            #      // ...
                            #
                            # Example (iOS / Obj-C):
                            #
                            #      // ...
                            #      static UIColor* fromProto(Color* protocolor) {
                            #         float red = [protocolor red];
                            #         float green = [protocolor green];
                            #         float blue = [protocolor blue];
                            #         FloatValue* alpha_wrapper = [protocolor alpha];
                            #         float alpha = 1.0;
                            #         if (alpha_wrapper != nil) {
                            #           alpha = [alpha_wrapper value];
                            #         }
                            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                            #      }
                            #
                            #      static Color* toProto(UIColor* color) {
                            #          CGFloat red, green, blue, alpha;
                            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                            #            return nil;
                            #          }
                            #          Color* result = [[Color alloc] init];
                            #          [result setRed:red];
                            #          [result setGreen:green];
                            #          [result setBlue:blue];
                            #          if (alpha &lt;= 0.9999) {
                            #            [result setAlpha:floatWrapperWithValue(alpha)];
                            #          }
                            #          [result autorelease];
                            #          return result;
                            #     }
                            #     // ...
                            #
                            #  Example (JavaScript):
                            #
                            #     // ...
                            #
                            #     var protoToCssColor = function(rgb_color) {
                            #        var redFrac = rgb_color.red || 0.0;
                            #        var greenFrac = rgb_color.green || 0.0;
                            #        var blueFrac = rgb_color.blue || 0.0;
                            #        var red = Math.floor(redFrac * 255);
                            #        var green = Math.floor(greenFrac * 255);
                            #        var blue = Math.floor(blueFrac * 255);
                            #
                            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                            #           return rgbToCssColor_(red, green, blue);
                            #        }
                            #
                            #        var alphaFrac = rgb_color.alpha.value || 0.0;
                            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                            #     };
                            #
                            #     var rgbToCssColor_ = function(red, green, blue) {
                            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                            #       var hexString = rgbNumber.toString(16);
                            #       var missingZeros = 6 - hexString.length;
                            #       var resultBuilder = [&#x27;#&#x27;];
                            #       for (var i = 0; i &lt; missingZeros; i++) {
                            #          resultBuilder.push(&#x27;0&#x27;);
                            #       }
                            #       resultBuilder.push(hexString);
                            #       return resultBuilder.join(&#x27;&#x27;);
                            #     };
                            #
                            #     // ...
                          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                              # the final pixel color is defined by the equation:
                              #
                              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                              #
                              # This means that a value of 1.0 corresponds to a solid color, whereas
                              # a value of 0.0 corresponds to a completely transparent color. This
                              # uses a wrapper message rather than a simple float scalar so that it is
                              # possible to distinguish between a default value and the value being unset.
                              # If omitted, this color object is to be rendered as a solid color
                              # (as if the alpha value had been explicitly given with a value of 1.0).
                          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                        },
                      },
                      &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
                          # When updating padding, every field must be specified.
                        &quot;right&quot;: 42, # The right padding of the cell.
                        &quot;bottom&quot;: 42, # The bottom padding of the cell.
                        &quot;left&quot;: 42, # The left padding of the cell.
                        &quot;top&quot;: 42, # The top padding of the cell.
                      },
                      &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
                          # for simplicity of conversion to/from color representations in various
                          # languages over compactness; for example, the fields of this representation
                          # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                          # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                          # method in iOS; and, with just a little work, it can be easily formatted into
                          # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                          #
                          # Note: this proto does not carry information about the absolute color space
                          # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                          # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                          # space.
                          #
                          # Example (Java):
                          #
                          #      import com.google.type.Color;
                          #
                          #      // ...
                          #      public static java.awt.Color fromProto(Color protocolor) {
                          #        float alpha = protocolor.hasAlpha()
                          #            ? protocolor.getAlpha().getValue()
                          #            : 1.0;
                          #
                          #        return new java.awt.Color(
                          #            protocolor.getRed(),
                          #            protocolor.getGreen(),
                          #            protocolor.getBlue(),
                          #            alpha);
                          #      }
                          #
                          #      public static Color toProto(java.awt.Color color) {
                          #        float red = (float) color.getRed();
                          #        float green = (float) color.getGreen();
                          #        float blue = (float) color.getBlue();
                          #        float denominator = 255.0;
                          #        Color.Builder resultBuilder =
                          #            Color
                          #                .newBuilder()
                          #                .setRed(red / denominator)
                          #                .setGreen(green / denominator)
                          #                .setBlue(blue / denominator);
                          #        int alpha = color.getAlpha();
                          #        if (alpha != 255) {
                          #          result.setAlpha(
                          #              FloatValue
                          #                  .newBuilder()
                          #                  .setValue(((float) alpha) / denominator)
                          #                  .build());
                          #        }
                          #        return resultBuilder.build();
                          #      }
                          #      // ...
                          #
                          # Example (iOS / Obj-C):
                          #
                          #      // ...
                          #      static UIColor* fromProto(Color* protocolor) {
                          #         float red = [protocolor red];
                          #         float green = [protocolor green];
                          #         float blue = [protocolor blue];
                          #         FloatValue* alpha_wrapper = [protocolor alpha];
                          #         float alpha = 1.0;
                          #         if (alpha_wrapper != nil) {
                          #           alpha = [alpha_wrapper value];
                          #         }
                          #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                          #      }
                          #
                          #      static Color* toProto(UIColor* color) {
                          #          CGFloat red, green, blue, alpha;
                          #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                          #            return nil;
                          #          }
                          #          Color* result = [[Color alloc] init];
                          #          [result setRed:red];
                          #          [result setGreen:green];
                          #          [result setBlue:blue];
                          #          if (alpha &lt;= 0.9999) {
                          #            [result setAlpha:floatWrapperWithValue(alpha)];
                          #          }
                          #          [result autorelease];
                          #          return result;
                          #     }
                          #     // ...
                          #
                          #  Example (JavaScript):
                          #
                          #     // ...
                          #
                          #     var protoToCssColor = function(rgb_color) {
                          #        var redFrac = rgb_color.red || 0.0;
                          #        var greenFrac = rgb_color.green || 0.0;
                          #        var blueFrac = rgb_color.blue || 0.0;
                          #        var red = Math.floor(redFrac * 255);
                          #        var green = Math.floor(greenFrac * 255);
                          #        var blue = Math.floor(blueFrac * 255);
                          #
                          #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                          #           return rgbToCssColor_(red, green, blue);
                          #        }
                          #
                          #        var alphaFrac = rgb_color.alpha.value || 0.0;
                          #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                          #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                          #     };
                          #
                          #     var rgbToCssColor_ = function(red, green, blue) {
                          #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                          #       var hexString = rgbNumber.toString(16);
                          #       var missingZeros = 6 - hexString.length;
                          #       var resultBuilder = [&#x27;#&#x27;];
                          #       for (var i = 0; i &lt; missingZeros; i++) {
                          #          resultBuilder.push(&#x27;0&#x27;);
                          #       }
                          #       resultBuilder.push(hexString);
                          #       return resultBuilder.join(&#x27;&#x27;);
                          #     };
                          #
                          #     // ...
                        &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                            # the final pixel color is defined by the equation:
                            #
                            #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                            #
                            # This means that a value of 1.0 corresponds to a solid color, whereas
                            # a value of 0.0 corresponds to a completely transparent color. This
                            # uses a wrapper message rather than a simple float scalar so that it is
                            # possible to distinguish between a default value and the value being unset.
                            # If omitted, this color object is to be rendered as a solid color
                            # (as if the alpha value had been explicitly given with a value of 1.0).
                        &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                        &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                        &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
                      },
                    },
                    &quot;userEnteredValue&quot;: { # The kinds of value that a cell in a spreadsheet can have. # The value the user entered in the cell. e.g, `1234`, `&#x27;Hello&#x27;`, or `=NOW()`
                        # Note: Dates, Times and DateTimes are represented as doubles in
                        # serial number format.
                      &quot;errorValue&quot;: { # An error in a cell. # Represents an error.
                          # This field is read-only.
                        &quot;message&quot;: &quot;A String&quot;, # A message with more information about the error
                            # (in the spreadsheet&#x27;s locale).
                        &quot;type&quot;: &quot;A String&quot;, # The type of error.
                      },
                      &quot;boolValue&quot;: True or False, # Represents a boolean value.
                      &quot;stringValue&quot;: &quot;A String&quot;, # Represents a string value.
                          # Leading single quotes are not included. For example, if the user typed
                          # `&#x27;123` into the UI, this would be represented as a `stringValue` of
                          # `&quot;123&quot;`.
                      &quot;formulaValue&quot;: &quot;A String&quot;, # Represents a formula.
                      &quot;numberValue&quot;: 3.14, # Represents a double value.
                          # Note: Dates, Times and DateTimes are represented as doubles in
                          # &quot;serial number&quot; format.
                    },
                    &quot;dataValidation&quot;: { # A data validation rule. # A data validation rule on the cell, if any.
                        #
                        # When writing, the new data validation rule will overwrite any prior rule.
                      &quot;showCustomUi&quot;: True or False, # True if the UI should be customized based on the kind of condition.
                          # If true, &quot;List&quot; conditions will show a dropdown.
                      &quot;strict&quot;: True or False, # True if invalid data should be rejected.
                      &quot;inputMessage&quot;: &quot;A String&quot;, # A message to show the user when adding data to the cell.
                      &quot;condition&quot;: { # A condition that can evaluate to true or false. # The condition that data in the cell must match.
                          # BooleanConditions are used by conditional formatting,
                          # data validation, and the criteria in filters.
                        &quot;values&quot;: [ # The values of the condition. The number of supported values depends
                            # on the condition type.  Some support zero values,
                            # others one or two values,
                            # and ConditionType.ONE_OF_LIST supports an arbitrary number of values.
                          { # The value of the condition.
                            &quot;relativeDate&quot;: &quot;A String&quot;, # A relative date (based on the current date).
                                # Valid only if the type is
                                # DATE_BEFORE,
                                # DATE_AFTER,
                                # DATE_ON_OR_BEFORE or
                                # DATE_ON_OR_AFTER.
                                #
                                # Relative dates are not supported in data validation.
                                # They are supported only in conditional formatting and
                                # conditional filters.
                            &quot;userEnteredValue&quot;: &quot;A String&quot;, # A value the condition is based on.
                                # The value is parsed as if the user typed into a cell.
                                # Formulas are supported (and must begin with an `=` or a &#x27;+&#x27;).
                          },
                        ],
                        &quot;type&quot;: &quot;A String&quot;, # The type of condition.
                      },
                    },
                    &quot;hyperlink&quot;: &quot;A String&quot;, # A hyperlink this cell points to, if any.
                        # This field is read-only.  (To set it, use a `=HYPERLINK` formula
                        # in the userEnteredValue.formulaValue
                        # field.)
                  },
                ],
              },
            ],
            &quot;rowMetadata&quot;: [ # Metadata about the requested rows in the grid, starting with the row
                # in start_row.
              { # Properties about a dimension.
                &quot;pixelSize&quot;: 42, # The height (if a row) or width (if a column) of the dimension in pixels.
                &quot;hiddenByFilter&quot;: True or False, # True if this dimension is being filtered.
                    # This field is read-only.
                &quot;hiddenByUser&quot;: True or False, # True if this dimension is explicitly hidden.
                &quot;developerMetadata&quot;: [ # The developer metadata associated with a single row or column.
                  { # Developer metadata associated with a location or object in a spreadsheet.
                      # Developer metadata may be used to associate arbitrary data with various
                      # parts of a spreadsheet and will remain associated at those locations as they
                      # move around and the spreadsheet is edited.  For example, if developer
                      # metadata is associated with row 5 and another row is then subsequently
                      # inserted above row 5, that original metadata will still be associated with
                      # the row it was first associated with (what is now row 6). If the associated
                      # object is deleted its metadata is deleted too.
                    &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
                        # same key.  Developer metadata must always have a key specified.
                    &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
                    &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
                        # specified.
                    &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
                        # specified when metadata is created, otherwise one will be randomly
                        # generated and assigned. Must be positive.
                    &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
                      &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
                      &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
                      &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
                      &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
                          # a dimension. The specified DimensionRange must represent a single row
                          # or column; it cannot be unbounded or span multiple rows or columns.
                          # All indexes are zero-based.
                          # Indexes are half open: the start index is inclusive
                          # and the end index is exclusive.
                          # Missing indexes indicate the range is unbounded on that side.
                        &quot;sheetId&quot;: 42, # The sheet this span is on.
                        &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
                        &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
                        &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
                      },
                    },
                  },
                ],
              },
            ],
            &quot;startColumn&quot;: 42, # The first column this GridData refers to, zero-based.
            &quot;startRow&quot;: 42, # The first row this GridData refers to, zero-based.
          },
        ],
      },
    ],
    &quot;spreadsheetId&quot;: &quot;A String&quot;, # The ID of the spreadsheet.
        # This field is read-only.
    &quot;properties&quot;: { # Properties of a spreadsheet. # Overall properties of a spreadsheet.
      &quot;title&quot;: &quot;A String&quot;, # The title of the spreadsheet.
      &quot;defaultFormat&quot;: { # The format of a cell. # The default format of all cells in the spreadsheet.
          # CellData.effectiveFormat will not be set if
          # the cell&#x27;s format is equal to this default format. This field is read-only.
        &quot;verticalAlignment&quot;: &quot;A String&quot;, # The vertical alignment of the value in the cell.
        &quot;hyperlinkDisplayType&quot;: &quot;A String&quot;, # How a hyperlink, if it exists, should be displayed in the cell.
        &quot;horizontalAlignment&quot;: &quot;A String&quot;, # The horizontal alignment of the value in the cell.
        &quot;textDirection&quot;: &quot;A String&quot;, # The direction of the text in the cell.
        &quot;numberFormat&quot;: { # The number format of a cell. # A format describing how number values should be represented to the user.
          &quot;pattern&quot;: &quot;A String&quot;, # Pattern string used for formatting.  If not set, a default pattern based on
              # the user&#x27;s locale will be used if necessary for the given type.
              # See the [Date and Number Formats guide](/sheets/api/guides/formats) for
              # more information about the supported patterns.
          &quot;type&quot;: &quot;A String&quot;, # The type of the number format.
              # When writing, this field must be set.
        },
        &quot;borders&quot;: { # The borders of the cell. # The borders of the cell.
          &quot;left&quot;: { # A border along a cell. # The left border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;top&quot;: { # A border along a cell. # The top border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;right&quot;: { # A border along a cell. # The right border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
          &quot;bottom&quot;: { # A border along a cell. # The bottom border of the cell.
            &quot;width&quot;: 42, # The width of the border, in pixels.
                # Deprecated; the width is determined by the &quot;style&quot; field.
            &quot;colorStyle&quot;: { # A color value. # The color of the border.
                # If color is also set, this field takes precedence.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
            &quot;color&quot;: { # Represents a color in the RGBA color space. This representation is designed # The color of the border.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
            &quot;style&quot;: &quot;A String&quot;, # The style of the border.
          },
        },
        &quot;wrapStrategy&quot;: &quot;A String&quot;, # The wrap strategy for the value in the cell.
        &quot;textFormat&quot;: { # The format of a run of text in a cell. # The format of the text in the cell (unless overridden by a format run).
            # Absent values indicate that the field isn&#x27;t specified.
          &quot;fontSize&quot;: 42, # The size of the font.
          &quot;underline&quot;: True or False, # True if the text is underlined.
          &quot;foregroundColorStyle&quot;: { # A color value. # The foreground color of the text.
              # If foreground_color is also set, this field takes precedence.
            &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
            &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                # for simplicity of conversion to/from color representations in various
                # languages over compactness; for example, the fields of this representation
                # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                # method in iOS; and, with just a little work, it can be easily formatted into
                # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                #
                # Note: this proto does not carry information about the absolute color space
                # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                # space.
                #
                # Example (Java):
                #
                #      import com.google.type.Color;
                #
                #      // ...
                #      public static java.awt.Color fromProto(Color protocolor) {
                #        float alpha = protocolor.hasAlpha()
                #            ? protocolor.getAlpha().getValue()
                #            : 1.0;
                #
                #        return new java.awt.Color(
                #            protocolor.getRed(),
                #            protocolor.getGreen(),
                #            protocolor.getBlue(),
                #            alpha);
                #      }
                #
                #      public static Color toProto(java.awt.Color color) {
                #        float red = (float) color.getRed();
                #        float green = (float) color.getGreen();
                #        float blue = (float) color.getBlue();
                #        float denominator = 255.0;
                #        Color.Builder resultBuilder =
                #            Color
                #                .newBuilder()
                #                .setRed(red / denominator)
                #                .setGreen(green / denominator)
                #                .setBlue(blue / denominator);
                #        int alpha = color.getAlpha();
                #        if (alpha != 255) {
                #          result.setAlpha(
                #              FloatValue
                #                  .newBuilder()
                #                  .setValue(((float) alpha) / denominator)
                #                  .build());
                #        }
                #        return resultBuilder.build();
                #      }
                #      // ...
                #
                # Example (iOS / Obj-C):
                #
                #      // ...
                #      static UIColor* fromProto(Color* protocolor) {
                #         float red = [protocolor red];
                #         float green = [protocolor green];
                #         float blue = [protocolor blue];
                #         FloatValue* alpha_wrapper = [protocolor alpha];
                #         float alpha = 1.0;
                #         if (alpha_wrapper != nil) {
                #           alpha = [alpha_wrapper value];
                #         }
                #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                #      }
                #
                #      static Color* toProto(UIColor* color) {
                #          CGFloat red, green, blue, alpha;
                #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                #            return nil;
                #          }
                #          Color* result = [[Color alloc] init];
                #          [result setRed:red];
                #          [result setGreen:green];
                #          [result setBlue:blue];
                #          if (alpha &lt;= 0.9999) {
                #            [result setAlpha:floatWrapperWithValue(alpha)];
                #          }
                #          [result autorelease];
                #          return result;
                #     }
                #     // ...
                #
                #  Example (JavaScript):
                #
                #     // ...
                #
                #     var protoToCssColor = function(rgb_color) {
                #        var redFrac = rgb_color.red || 0.0;
                #        var greenFrac = rgb_color.green || 0.0;
                #        var blueFrac = rgb_color.blue || 0.0;
                #        var red = Math.floor(redFrac * 255);
                #        var green = Math.floor(greenFrac * 255);
                #        var blue = Math.floor(blueFrac * 255);
                #
                #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                #           return rgbToCssColor_(red, green, blue);
                #        }
                #
                #        var alphaFrac = rgb_color.alpha.value || 0.0;
                #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                #     };
                #
                #     var rgbToCssColor_ = function(red, green, blue) {
                #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                #       var hexString = rgbNumber.toString(16);
                #       var missingZeros = 6 - hexString.length;
                #       var resultBuilder = [&#x27;#&#x27;];
                #       for (var i = 0; i &lt; missingZeros; i++) {
                #          resultBuilder.push(&#x27;0&#x27;);
                #       }
                #       resultBuilder.push(hexString);
                #       return resultBuilder.join(&#x27;&#x27;);
                #     };
                #
                #     // ...
              &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                  # the final pixel color is defined by the equation:
                  #
                  #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                  #
                  # This means that a value of 1.0 corresponds to a solid color, whereas
                  # a value of 0.0 corresponds to a completely transparent color. This
                  # uses a wrapper message rather than a simple float scalar so that it is
                  # possible to distinguish between a default value and the value being unset.
                  # If omitted, this color object is to be rendered as a solid color
                  # (as if the alpha value had been explicitly given with a value of 1.0).
              &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
              &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
              &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
            },
          },
          &quot;bold&quot;: True or False, # True if the text is bold.
          &quot;foregroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The foreground color of the text.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
          &quot;italic&quot;: True or False, # True if the text is italicized.
          &quot;strikethrough&quot;: True or False, # True if the text has a strikethrough.
          &quot;fontFamily&quot;: &quot;A String&quot;, # The font family.
        },
        &quot;textRotation&quot;: { # The rotation applied to text in a cell. # The rotation applied to text in a cell
          &quot;angle&quot;: 42, # The angle between the standard orientation and the desired orientation.
              # Measured in degrees. Valid values are between -90 and 90. Positive
              # angles are angled upwards, negative are angled downwards.
              #
              # Note: For LTR text direction positive angles are in the
              # counterclockwise direction, whereas for RTL they are in the clockwise
              # direction
          &quot;vertical&quot;: True or False, # If true, text reads top to bottom, but the orientation of individual
              # characters is unchanged.
              # For example:
              #
              #     | V |
              #     | e |
              #     | r |
              #     | t |
              #     | i |
              #     | c |
              #     | a |
              #     | l |
        },
        &quot;backgroundColorStyle&quot;: { # A color value. # The background color of the cell.
            # If background_color is also set, this field takes precedence.
          &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
          &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
              # for simplicity of conversion to/from color representations in various
              # languages over compactness; for example, the fields of this representation
              # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
              # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
              # method in iOS; and, with just a little work, it can be easily formatted into
              # a CSS &quot;rgba()&quot; string in JavaScript, as well.
              #
              # Note: this proto does not carry information about the absolute color space
              # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
              # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
              # space.
              #
              # Example (Java):
              #
              #      import com.google.type.Color;
              #
              #      // ...
              #      public static java.awt.Color fromProto(Color protocolor) {
              #        float alpha = protocolor.hasAlpha()
              #            ? protocolor.getAlpha().getValue()
              #            : 1.0;
              #
              #        return new java.awt.Color(
              #            protocolor.getRed(),
              #            protocolor.getGreen(),
              #            protocolor.getBlue(),
              #            alpha);
              #      }
              #
              #      public static Color toProto(java.awt.Color color) {
              #        float red = (float) color.getRed();
              #        float green = (float) color.getGreen();
              #        float blue = (float) color.getBlue();
              #        float denominator = 255.0;
              #        Color.Builder resultBuilder =
              #            Color
              #                .newBuilder()
              #                .setRed(red / denominator)
              #                .setGreen(green / denominator)
              #                .setBlue(blue / denominator);
              #        int alpha = color.getAlpha();
              #        if (alpha != 255) {
              #          result.setAlpha(
              #              FloatValue
              #                  .newBuilder()
              #                  .setValue(((float) alpha) / denominator)
              #                  .build());
              #        }
              #        return resultBuilder.build();
              #      }
              #      // ...
              #
              # Example (iOS / Obj-C):
              #
              #      // ...
              #      static UIColor* fromProto(Color* protocolor) {
              #         float red = [protocolor red];
              #         float green = [protocolor green];
              #         float blue = [protocolor blue];
              #         FloatValue* alpha_wrapper = [protocolor alpha];
              #         float alpha = 1.0;
              #         if (alpha_wrapper != nil) {
              #           alpha = [alpha_wrapper value];
              #         }
              #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
              #      }
              #
              #      static Color* toProto(UIColor* color) {
              #          CGFloat red, green, blue, alpha;
              #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
              #            return nil;
              #          }
              #          Color* result = [[Color alloc] init];
              #          [result setRed:red];
              #          [result setGreen:green];
              #          [result setBlue:blue];
              #          if (alpha &lt;= 0.9999) {
              #            [result setAlpha:floatWrapperWithValue(alpha)];
              #          }
              #          [result autorelease];
              #          return result;
              #     }
              #     // ...
              #
              #  Example (JavaScript):
              #
              #     // ...
              #
              #     var protoToCssColor = function(rgb_color) {
              #        var redFrac = rgb_color.red || 0.0;
              #        var greenFrac = rgb_color.green || 0.0;
              #        var blueFrac = rgb_color.blue || 0.0;
              #        var red = Math.floor(redFrac * 255);
              #        var green = Math.floor(greenFrac * 255);
              #        var blue = Math.floor(blueFrac * 255);
              #
              #        if (!(&#x27;alpha&#x27; in rgb_color)) {
              #           return rgbToCssColor_(red, green, blue);
              #        }
              #
              #        var alphaFrac = rgb_color.alpha.value || 0.0;
              #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
              #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
              #     };
              #
              #     var rgbToCssColor_ = function(red, green, blue) {
              #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
              #       var hexString = rgbNumber.toString(16);
              #       var missingZeros = 6 - hexString.length;
              #       var resultBuilder = [&#x27;#&#x27;];
              #       for (var i = 0; i &lt; missingZeros; i++) {
              #          resultBuilder.push(&#x27;0&#x27;);
              #       }
              #       resultBuilder.push(hexString);
              #       return resultBuilder.join(&#x27;&#x27;);
              #     };
              #
              #     // ...
            &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                # the final pixel color is defined by the equation:
                #
                #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                #
                # This means that a value of 1.0 corresponds to a solid color, whereas
                # a value of 0.0 corresponds to a completely transparent color. This
                # uses a wrapper message rather than a simple float scalar so that it is
                # possible to distinguish between a default value and the value being unset.
                # If omitted, this color object is to be rendered as a solid color
                # (as if the alpha value had been explicitly given with a value of 1.0).
            &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
            &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
            &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
          },
        },
        &quot;padding&quot;: { # The amount of padding around the cell, in pixels. # The padding of the cell.
            # When updating padding, every field must be specified.
          &quot;right&quot;: 42, # The right padding of the cell.
          &quot;bottom&quot;: 42, # The bottom padding of the cell.
          &quot;left&quot;: 42, # The left padding of the cell.
          &quot;top&quot;: 42, # The top padding of the cell.
        },
        &quot;backgroundColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # The background color of the cell.
            # for simplicity of conversion to/from color representations in various
            # languages over compactness; for example, the fields of this representation
            # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
            # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
            # method in iOS; and, with just a little work, it can be easily formatted into
            # a CSS &quot;rgba()&quot; string in JavaScript, as well.
            #
            # Note: this proto does not carry information about the absolute color space
            # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
            # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
            # space.
            #
            # Example (Java):
            #
            #      import com.google.type.Color;
            #
            #      // ...
            #      public static java.awt.Color fromProto(Color protocolor) {
            #        float alpha = protocolor.hasAlpha()
            #            ? protocolor.getAlpha().getValue()
            #            : 1.0;
            #
            #        return new java.awt.Color(
            #            protocolor.getRed(),
            #            protocolor.getGreen(),
            #            protocolor.getBlue(),
            #            alpha);
            #      }
            #
            #      public static Color toProto(java.awt.Color color) {
            #        float red = (float) color.getRed();
            #        float green = (float) color.getGreen();
            #        float blue = (float) color.getBlue();
            #        float denominator = 255.0;
            #        Color.Builder resultBuilder =
            #            Color
            #                .newBuilder()
            #                .setRed(red / denominator)
            #                .setGreen(green / denominator)
            #                .setBlue(blue / denominator);
            #        int alpha = color.getAlpha();
            #        if (alpha != 255) {
            #          result.setAlpha(
            #              FloatValue
            #                  .newBuilder()
            #                  .setValue(((float) alpha) / denominator)
            #                  .build());
            #        }
            #        return resultBuilder.build();
            #      }
            #      // ...
            #
            # Example (iOS / Obj-C):
            #
            #      // ...
            #      static UIColor* fromProto(Color* protocolor) {
            #         float red = [protocolor red];
            #         float green = [protocolor green];
            #         float blue = [protocolor blue];
            #         FloatValue* alpha_wrapper = [protocolor alpha];
            #         float alpha = 1.0;
            #         if (alpha_wrapper != nil) {
            #           alpha = [alpha_wrapper value];
            #         }
            #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
            #      }
            #
            #      static Color* toProto(UIColor* color) {
            #          CGFloat red, green, blue, alpha;
            #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
            #            return nil;
            #          }
            #          Color* result = [[Color alloc] init];
            #          [result setRed:red];
            #          [result setGreen:green];
            #          [result setBlue:blue];
            #          if (alpha &lt;= 0.9999) {
            #            [result setAlpha:floatWrapperWithValue(alpha)];
            #          }
            #          [result autorelease];
            #          return result;
            #     }
            #     // ...
            #
            #  Example (JavaScript):
            #
            #     // ...
            #
            #     var protoToCssColor = function(rgb_color) {
            #        var redFrac = rgb_color.red || 0.0;
            #        var greenFrac = rgb_color.green || 0.0;
            #        var blueFrac = rgb_color.blue || 0.0;
            #        var red = Math.floor(redFrac * 255);
            #        var green = Math.floor(greenFrac * 255);
            #        var blue = Math.floor(blueFrac * 255);
            #
            #        if (!(&#x27;alpha&#x27; in rgb_color)) {
            #           return rgbToCssColor_(red, green, blue);
            #        }
            #
            #        var alphaFrac = rgb_color.alpha.value || 0.0;
            #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
            #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
            #     };
            #
            #     var rgbToCssColor_ = function(red, green, blue) {
            #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
            #       var hexString = rgbNumber.toString(16);
            #       var missingZeros = 6 - hexString.length;
            #       var resultBuilder = [&#x27;#&#x27;];
            #       for (var i = 0; i &lt; missingZeros; i++) {
            #          resultBuilder.push(&#x27;0&#x27;);
            #       }
            #       resultBuilder.push(hexString);
            #       return resultBuilder.join(&#x27;&#x27;);
            #     };
            #
            #     // ...
          &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
              # the final pixel color is defined by the equation:
              #
              #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
              #
              # This means that a value of 1.0 corresponds to a solid color, whereas
              # a value of 0.0 corresponds to a completely transparent color. This
              # uses a wrapper message rather than a simple float scalar so that it is
              # possible to distinguish between a default value and the value being unset.
              # If omitted, this color object is to be rendered as a solid color
              # (as if the alpha value had been explicitly given with a value of 1.0).
          &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
          &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
          &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
        },
      },
      &quot;autoRecalc&quot;: &quot;A String&quot;, # The amount of time to wait before volatile functions are recalculated.
      &quot;iterativeCalculationSettings&quot;: { # Settings to control how circular dependencies are resolved with iterative # Determines whether and how circular references are resolved with iterative
          # calculation.  Absence of this field means that circular references result
          # in calculation errors.
          # calculation.
        &quot;maxIterations&quot;: 42, # When iterative calculation is enabled, the maximum number of calculation
            # rounds to perform.
        &quot;convergenceThreshold&quot;: 3.14, # When iterative calculation is enabled and successive results differ by
            # less than this threshold value, the calculation rounds stop.
      },
      &quot;timeZone&quot;: &quot;A String&quot;, # The time zone of the spreadsheet, in CLDR format such as
          # `America/New_York`. If the time zone isn&#x27;t recognized, this may
          # be a custom time zone such as `GMT-07:00`.
      &quot;spreadsheetTheme&quot;: { # Represents spreadsheet theme # Theme applied to the spreadsheet.
        &quot;primaryFontFamily&quot;: &quot;A String&quot;, # / Name of the primary font family.
        &quot;themeColors&quot;: [ # The spreadsheet theme color pairs. To update you must provide all theme
            # color pairs.
          { # A pair mapping a spreadsheet theme color type to the concrete color it
              # represents.
            &quot;colorType&quot;: &quot;A String&quot;, # The type of the spreadsheet theme color.
            &quot;color&quot;: { # A color value. # The concrete color corresponding to the theme color type.
              &quot;themeColor&quot;: &quot;A String&quot;, # Theme color.
              &quot;rgbColor&quot;: { # Represents a color in the RGBA color space. This representation is designed # RGB color.
                  # for simplicity of conversion to/from color representations in various
                  # languages over compactness; for example, the fields of this representation
                  # can be trivially provided to the constructor of &quot;java.awt.Color&quot; in Java; it
                  # can also be trivially provided to UIColor&#x27;s &quot;+colorWithRed:green:blue:alpha&quot;
                  # method in iOS; and, with just a little work, it can be easily formatted into
                  # a CSS &quot;rgba()&quot; string in JavaScript, as well.
                  #
                  # Note: this proto does not carry information about the absolute color space
                  # that should be used to interpret the RGB value (e.g. sRGB, Adobe RGB,
                  # DCI-P3, BT.2020, etc.). By default, applications SHOULD assume the sRGB color
                  # space.
                  #
                  # Example (Java):
                  #
                  #      import com.google.type.Color;
                  #
                  #      // ...
                  #      public static java.awt.Color fromProto(Color protocolor) {
                  #        float alpha = protocolor.hasAlpha()
                  #            ? protocolor.getAlpha().getValue()
                  #            : 1.0;
                  #
                  #        return new java.awt.Color(
                  #            protocolor.getRed(),
                  #            protocolor.getGreen(),
                  #            protocolor.getBlue(),
                  #            alpha);
                  #      }
                  #
                  #      public static Color toProto(java.awt.Color color) {
                  #        float red = (float) color.getRed();
                  #        float green = (float) color.getGreen();
                  #        float blue = (float) color.getBlue();
                  #        float denominator = 255.0;
                  #        Color.Builder resultBuilder =
                  #            Color
                  #                .newBuilder()
                  #                .setRed(red / denominator)
                  #                .setGreen(green / denominator)
                  #                .setBlue(blue / denominator);
                  #        int alpha = color.getAlpha();
                  #        if (alpha != 255) {
                  #          result.setAlpha(
                  #              FloatValue
                  #                  .newBuilder()
                  #                  .setValue(((float) alpha) / denominator)
                  #                  .build());
                  #        }
                  #        return resultBuilder.build();
                  #      }
                  #      // ...
                  #
                  # Example (iOS / Obj-C):
                  #
                  #      // ...
                  #      static UIColor* fromProto(Color* protocolor) {
                  #         float red = [protocolor red];
                  #         float green = [protocolor green];
                  #         float blue = [protocolor blue];
                  #         FloatValue* alpha_wrapper = [protocolor alpha];
                  #         float alpha = 1.0;
                  #         if (alpha_wrapper != nil) {
                  #           alpha = [alpha_wrapper value];
                  #         }
                  #         return [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
                  #      }
                  #
                  #      static Color* toProto(UIColor* color) {
                  #          CGFloat red, green, blue, alpha;
                  #          if (![color getRed:&amp;red green:&amp;green blue:&amp;blue alpha:&amp;alpha]) {
                  #            return nil;
                  #          }
                  #          Color* result = [[Color alloc] init];
                  #          [result setRed:red];
                  #          [result setGreen:green];
                  #          [result setBlue:blue];
                  #          if (alpha &lt;= 0.9999) {
                  #            [result setAlpha:floatWrapperWithValue(alpha)];
                  #          }
                  #          [result autorelease];
                  #          return result;
                  #     }
                  #     // ...
                  #
                  #  Example (JavaScript):
                  #
                  #     // ...
                  #
                  #     var protoToCssColor = function(rgb_color) {
                  #        var redFrac = rgb_color.red || 0.0;
                  #        var greenFrac = rgb_color.green || 0.0;
                  #        var blueFrac = rgb_color.blue || 0.0;
                  #        var red = Math.floor(redFrac * 255);
                  #        var green = Math.floor(greenFrac * 255);
                  #        var blue = Math.floor(blueFrac * 255);
                  #
                  #        if (!(&#x27;alpha&#x27; in rgb_color)) {
                  #           return rgbToCssColor_(red, green, blue);
                  #        }
                  #
                  #        var alphaFrac = rgb_color.alpha.value || 0.0;
                  #        var rgbParams = [red, green, blue].join(&#x27;,&#x27;);
                  #        return [&#x27;rgba(&#x27;, rgbParams, &#x27;,&#x27;, alphaFrac, &#x27;)&#x27;].join(&#x27;&#x27;);
                  #     };
                  #
                  #     var rgbToCssColor_ = function(red, green, blue) {
                  #       var rgbNumber = new Number((red &lt;&lt; 16) | (green &lt;&lt; 8) | blue);
                  #       var hexString = rgbNumber.toString(16);
                  #       var missingZeros = 6 - hexString.length;
                  #       var resultBuilder = [&#x27;#&#x27;];
                  #       for (var i = 0; i &lt; missingZeros; i++) {
                  #          resultBuilder.push(&#x27;0&#x27;);
                  #       }
                  #       resultBuilder.push(hexString);
                  #       return resultBuilder.join(&#x27;&#x27;);
                  #     };
                  #
                  #     // ...
                &quot;alpha&quot;: 3.14, # The fraction of this color that should be applied to the pixel. That is,
                    # the final pixel color is defined by the equation:
                    #
                    #   pixel color = alpha * (this color) + (1.0 - alpha) * (background color)
                    #
                    # This means that a value of 1.0 corresponds to a solid color, whereas
                    # a value of 0.0 corresponds to a completely transparent color. This
                    # uses a wrapper message rather than a simple float scalar so that it is
                    # possible to distinguish between a default value and the value being unset.
                    # If omitted, this color object is to be rendered as a solid color
                    # (as if the alpha value had been explicitly given with a value of 1.0).
                &quot;red&quot;: 3.14, # The amount of red in the color as a value in the interval [0, 1].
                &quot;green&quot;: 3.14, # The amount of green in the color as a value in the interval [0, 1].
                &quot;blue&quot;: 3.14, # The amount of blue in the color as a value in the interval [0, 1].
              },
            },
          },
        ],
      },
      &quot;locale&quot;: &quot;A String&quot;, # The locale of the spreadsheet in one of the following formats:
          #
          # * an ISO 639-1 language code such as `en`
          #
          # * an ISO 639-2 language code such as `fil`, if no 639-1 code exists
          #
          # * a combination of the ISO language code and country code, such as `en_US`
          #
          # Note: when updating this field, not all locales/languages are supported.
    },
    &quot;namedRanges&quot;: [ # The named ranges defined in a spreadsheet.
      { # A named range.
        &quot;namedRangeId&quot;: &quot;A String&quot;, # The ID of the named range.
        &quot;range&quot;: { # A range on a sheet. # The range this represents.
            # All indexes are zero-based.
            # Indexes are half open, e.g the start index is inclusive
            # and the end index is exclusive -- [start_index, end_index).
            # Missing indexes indicate the range is unbounded on that side.
            #
            # For example, if `&quot;Sheet1&quot;` is sheet ID 0, then:
            #
            #   `Sheet1!A1:A1 == sheet_id: 0,
            #                   start_row_index: 0, end_row_index: 1,
            #                   start_column_index: 0, end_column_index: 1`
            #
            #   `Sheet1!A3:B4 == sheet_id: 0,
            #                   start_row_index: 2, end_row_index: 4,
            #                   start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A:B == sheet_id: 0,
            #                 start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1!A5:B == sheet_id: 0,
            #                  start_row_index: 4,
            #                  start_column_index: 0, end_column_index: 2`
            #
            #   `Sheet1 == sheet_id:0`
            #
            # The start index must always be less than or equal to the end index.
            # If the start index equals the end index, then the range is empty.
            # Empty ranges are typically not meaningful and are usually rendered in the
            # UI as `#REF!`.
          &quot;endRowIndex&quot;: 42, # The end row (exclusive) of the range, or not set if unbounded.
          &quot;startColumnIndex&quot;: 42, # The start column (inclusive) of the range, or not set if unbounded.
          &quot;sheetId&quot;: 42, # The sheet this range is on.
          &quot;endColumnIndex&quot;: 42, # The end column (exclusive) of the range, or not set if unbounded.
          &quot;startRowIndex&quot;: 42, # The start row (inclusive) of the range, or not set if unbounded.
        },
        &quot;name&quot;: &quot;A String&quot;, # The name of the named range.
      },
    ],
    &quot;developerMetadata&quot;: [ # The developer metadata associated with a spreadsheet.
      { # Developer metadata associated with a location or object in a spreadsheet.
          # Developer metadata may be used to associate arbitrary data with various
          # parts of a spreadsheet and will remain associated at those locations as they
          # move around and the spreadsheet is edited.  For example, if developer
          # metadata is associated with row 5 and another row is then subsequently
          # inserted above row 5, that original metadata will still be associated with
          # the row it was first associated with (what is now row 6). If the associated
          # object is deleted its metadata is deleted too.
        &quot;metadataKey&quot;: &quot;A String&quot;, # The metadata key. There may be multiple metadata in a spreadsheet with the
            # same key.  Developer metadata must always have a key specified.
        &quot;metadataValue&quot;: &quot;A String&quot;, # Data associated with the metadata&#x27;s key.
        &quot;visibility&quot;: &quot;A String&quot;, # The metadata visibility.  Developer metadata must always have a visibility
            # specified.
        &quot;metadataId&quot;: 42, # The spreadsheet-scoped unique ID that identifies the metadata. IDs may be
            # specified when metadata is created, otherwise one will be randomly
            # generated and assigned. Must be positive.
        &quot;location&quot;: { # A location where metadata may be associated in a spreadsheet. # The location where the metadata is associated.
          &quot;sheetId&quot;: 42, # The ID of the sheet when metadata is associated with an entire sheet.
          &quot;spreadsheet&quot;: True or False, # True when metadata is associated with an entire spreadsheet.
          &quot;locationType&quot;: &quot;A String&quot;, # The type of location this object represents.  This field is read-only.
          &quot;dimensionRange&quot;: { # A range along a single dimension on a sheet. # Represents the row or column when metadata is associated with
              # a dimension. The specified DimensionRange must represent a single row
              # or column; it cannot be unbounded or span multiple rows or columns.
              # All indexes are zero-based.
              # Indexes are half open: the start index is inclusive
              # and the end index is exclusive.
              # Missing indexes indicate the range is unbounded on that side.
            &quot;sheetId&quot;: 42, # The sheet this span is on.
            &quot;endIndex&quot;: 42, # The end (exclusive) of the span, or not set if unbounded.
            &quot;startIndex&quot;: 42, # The start (inclusive) of the span, or not set if unbounded.
            &quot;dimension&quot;: &quot;A String&quot;, # The dimension of the span.
          },
        },
      },
    ],
  }</pre>
</div>

</body></html>